2017-01-12 70 views
0

在我的程序中,我有一个列表视图,显示来自SQL数据库的各种客户信息和一个按钮,将从数据库中清除所有客户条目。我的问题是:listview没有更新notifyDataSetChanged

  1. 当数据库为空时,应用程序将崩溃。
  2. 当有新的客户条目时,列表视图不会更新。我 已尝试notifyDataSetChanged()和notifyDataSetInvalidated(), 但该列表视图仍未更新。

我的主要程序:

package attendance.emily.example.com.attendance; 


import android.os.AsyncTask; 
import android.os.StrictMode; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 

import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 

import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.json.JSONArray; 

import org.json.JSONObject; 

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 



public class MainActivity extends AppCompatActivity { 

    Button cleardata; 
    TextView textview3, displayUser, displayTimeout, displayTimein, textview7; 
    ListView lv; 
    ArrayAdapter<String> adapter; 

    String address = "http://192.168.0.100:80/gps/get_logout.php"; 


    InputStream is = null; 

    String line = null; 

    String result = null; 

    String data[]; 






    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     lv = (ListView) findViewById(R.id.listView1); 


     cleardata = (Button) findViewById(R.id.button); 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

     StrictMode.setThreadPolicy(policy); 

     StrictMode.setThreadPolicy((new StrictMode.ThreadPolicy.Builder().permitNetwork().build())); 
     getdata3(); 


     adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data); 
     lv.setAdapter(adapter); 





     cleardata.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       String link = "http://192.168.0.100:80/gps/delete.php"; //using this IP for Genymotion emulator 
       new updateData().execute(link); 
       Toast.makeText(MainActivity.this, "Executed", Toast.LENGTH_LONG).show(); 
      } 
     }); 




    } 

    public class updateData extends AsyncTask<String, String, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      HttpURLConnection conn = null; 

      try { 
       URL url; 
       url = new URL(params[0]); 
       conn = (HttpURLConnection) url.openConnection(); 
       if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { 
        InputStream is = conn.getInputStream(); 
       } else { 
        InputStream err = conn.getErrorStream(); 
       } 
       return "Done"; 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       if (conn != null) { 
        conn.disconnect(); 
       } 
      } 
      return null; 
     } 

    } 



private void getdata3() 
{ 
    try{ 
     URL url = new URL(address); 
     HttpURLConnection con = (HttpURLConnection)url.openConnection(); 
     con.setRequestMethod("GET"); 
     is = new BufferedInputStream(con.getInputStream()); 



    } catch(Exception e){ 
     e.printStackTrace(); 
    } 

    try{ 
     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder sb = new StringBuilder(); 
     while ((line=br.readLine()) != null){ 
      sb.append(line+"\n"); 

     } 

     is.close(); 
     result = sb.toString(); 





    } catch(Exception e){ 
     e.printStackTrace(); 
    } 

    try { 
     String a=""; 
     String p=""; 
     String z=""; 
     JSONArray ja = new JSONArray(result); 
     JSONObject jo = null; 




     data=new String[ja.length()]; 


     for (int i=0; i<ja.length(); i++){ 
      jo = ja.getJSONObject(i); 
      a =jo.getString("user"); 
      p = jo.getString("MIN(timein)"); 
      z = jo.getString("MAX(timeout)"); 


      data[i] = "User: "+ a + "\n" +"Time In: " + p + "\n" + "Time Out: " + z+"\n" ; 



     } 

    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 

} 










} 

错误:

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: attendance.emily.example.com.attendance, PID: 11833 
        java.lang.RuntimeException: Unable to start activity ComponentInfo{attendance.emily.example.com.attendance/attendance.emily.example.com.attendance.MainActivity}: java.lang.NullPointerException: storage == null 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2653) 
         at android.app.ActivityThread.access$800(ActivityThread.java:156) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:157) 
         at android.app.ActivityThread.main(ActivityThread.java:5872) 
         at java.lang.reflect.Method.invokeNative(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:515) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674) 
         at dalvik.system.NativeStart.main(Native Method) 
        Caused by: java.lang.NullPointerException: storage == null 
         at java.util.Arrays$ArrayList.<init>(Arrays.java:38) 
         at java.util.Arrays.asList(Arrays.java:155) 
         at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128) 
         at attendance.emily.example.com.attendance.MainActivity.onCreate(MainActivity.java:73) 
         at android.app.Activity.performCreate(Activity.java:5312) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2552) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2653)  
         at android.app.ActivityThread.access$800(ActivityThread.java:156)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:157)  
         at android.app.ActivityThread.main(ActivityThread.java:5872)  
         at java.lang.reflect.Method.invokeNative(Native Method)  
         at java.lang.reflect.Method.invoke(Method.java:515)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)  
         at dalvik.system.NativeStart.main(Native Method)  

我如何能解决我的问题有什么建议?

+0

一个'LogCat'将有助于对崩溃。另外,我没有在你的'AsyncTask'中看到'onPostExecute()'?这是我期望该列表被填充的地方。 – KickingLettuce

+0

@KickingLettuce您好我是Android的新手,我正在关于如何创建列表视图来显示数据库信息的教程,youtuber根本不会创建onPostExecute()。对不起,我有什么要写在onPostExecute()?我已经更新了我的logcat。 –

+0

基本上'doInBackground()'的结果作为参数传递给'onPostExecute()'。虽然我经常'返回空'(在'doInBackground()'),所以我有('onPostExecute()')作为'void'函数。重点是,它在后台“获取数据”线程完成后运行('onPostExecute()')。所以如果你在后台填充一个'Array'或'ArrayList <>',你可以将它设置为一个类参数(或者只是传递它),并在'onPostExecute()'中使用它,并用它填充你的''adapter''。链接:https://developer.android.com/reference/android/os/AsyncTask.html – KickingLettuce

回答

0

你打电话adapter.notifyDataSetChanged();之前,您必须更新adapter(或所保存的数据),这样的事情:

String s = "new item"; 
adapter.add(s); 

然后

adapter.notifyDataSetChanged(); 

然而,更好的方法:

由于您使用的是String[]你不能添加项目。我建议使用ArrayList<String> list = new ArrayList<String>();,然后像现在这样使用它填充适配器。如果你想先显示一个新的列表项,更新列表,然后调用notifyDataSetChanged()所以

list.add(s); 
adapter.notifyDataSetChanged(); 

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list); 

然后,当你想添加一个新的项目,做到这一点。旁注:您也可以用相同的方式更新现有的行,但您必须获取该位置,通常从onClick方法传入。

Here is another great questions on this with good answers

相关问题