2014-09-28 189 views
-1

我一直試圖刷新listview,每當我刪除它的行。我使用BaseAdapter作爲listview。我沒有得到如何刷新它。我使用SQLite,同時刷新我也刪除數據庫中的行。如何使用BaseAdapter刷新或更新列表視圖?

public class MainActivity extends Activity { 

    DataBase md ; 
    ImageButton ib; 
    ListView notelist; 
    int i; 
    ArrayList<String> titles = new ArrayList<String>(); 
    ArrayList<String> not = new ArrayList<String>(); 
    ArrayList<String> date = new ArrayList<String>(); 
    ArrayList<String> time = new ArrayList<String>(); 

    ArrayList<String> Revtitles = new ArrayList<String>(); 
    ArrayList<String> Revnot = new ArrayList<String>(); 
    ArrayList<String> Revdate = new ArrayList<String>(); 
    ArrayList<String> Revtime = new ArrayList<String>(); 


    DataAdapter adapter; 

    View view; 

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

     md = new DataBase(this); 

     SQLiteDatabase sd = md.getReadableDatabase(); 

     Cursor c = sd.query(md.TABLE_NAME, null, null, null, null, null, null); 

     while (c.moveToNext()) { 

      titles.add(c.getString(0)); 
      not.add(c.getString(1)); 
      date.add(c.getString(2)); 
      time.add(c.getString(3)); 

     } 

     for (int i = titles.size() - 1; i >= 0; i--) { 

      Revtitles.add(titles.get(i)); 
      Revnot.add(not.get(i)); 
      Revdate.add(date.get(i)); 
      Revtime.add(time.get(i)); 

     } 

     notelist = (ListView) findViewById(R.id.listView1); 
     ib = (ImageButton) findViewById(R.id.imageButton1); 

     adapter = new DataAdapter(this); 
     notelist.setAdapter(adapter); 
     // notelist.setStackFromBottom(true); 
     notelist.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       // TODO Auto-generated method stub 
       Intent i = new Intent(MainActivity.this,Show.class); 

       i.putExtra("TITLE", Revtitles.get(arg2)); 
       i.putExtra("NOTE", Revnot.get(arg2)); 

       startActivity(i); 
       finish(); 

      } 
     }); 

     notelist.setOnItemLongClickListener(new OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View v, 
        final int pos, long arg3) { 
       // TODO Auto-generated method stub 
       final String st = Revtitles.get(pos); 
       String st1 = Revnot.get(pos); 

       AlertDialog.Builder ad = new AlertDialog.Builder(MainActivity.this); 
       ad.setMessage("Are sure you want to delete?"); 
       ad.setCancelable(false); 
       ad.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface arg0, int arg1) { 
         // TODO Auto-generated method stub 

        //sd.delete(md.TABLE_NAME, md.COL_ROLLNO+"=?", new String[]{st}); 

        //Intent i = new Intent(MainActivity.this,MainActivity.class); 
        //startActivity(i); 

       ///////PROBLEM LINES/////// 



         SQLiteDatabase sd = md.getWritableDatabase(); 

         sd.delete(md.TABLE_NAME,md.COL_TITLE+"=?", new String[]{st}); 

         Revtitles.remove(pos); 
         Revnot.remove(pos); 
         Revdate.remove(pos); 
         Revtime.remove(pos); 

         adapter.notifyDataSetChanged(); 
         adapter.notifyDataSetInvalidated(); 

         notelist.setAdapter(adapter); 

        } 



       }); 
       ad.setNegativeButton("No", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         // TODO Auto-generated method stub 
         dialog.dismiss(); 
        } 
       }); 

       AlertDialog adl = ad.create(); 
       adl.show(); 
       return true; 
      } 

     }); 

     ib.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       Intent i = new Intent(MainActivity.this, Add.class); 
       startActivity(i); 
       finish(); 
      } 
     }); 

    } 

    class DataAdapter extends BaseAdapter{ 

     private Context con; 
     LayoutInflater lat = getLayoutInflater(); 

     public DataAdapter(MainActivity mainActivity) { 
      // TODO Auto-generated constructor stub 
      this.con = mainActivity; 
     } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return titles.size(); 
     } 

     @Override 
     public Object getItem(int arg0) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public long getItemId(int arg0) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     @Override 
     public View getView(int position, View convo, ViewGroup arg2) { 
      // TODO Auto-generated method stub 
      convo = lat.inflate(R.layout.mainlist, null); 

      TextView tit = (TextView)convo.findViewById(R.id.inflatetitle); 
      TextView datea = (TextView)convo.findViewById(R.id.inflatedate); 
      String rtitle; 

      int len = Revtitles.get(position).length(); 
      if (len <= 20){ 
      rtitle = Revtitles.get(position); 
      } 
      else { 
       rtitle = Revtitles.get(position).substring(0, 20) + "..."; 
      } 
      tit.setText(rtitle); 
      datea.setText(Revdate.get(position) + "\n" + Revtime.get(position)); 

      view = convo; 
      return convo; 
     } 

    } 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      finish(); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

} 
+0

你應該_not_調用'adapter.notifyDataSetInvalidated();',請參閱相關的文檔:「通知所附的觀察員底層數據不再有效或可用。一旦調用此適配器不再有效,不應報告進一步的數據集更改。「 (http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetInvalidated()) – Kai 2014-09-28 13:35:56

回答

0
您使用 getView()SQLite數據適應你 listView,你在刪除某個項目後

listView您應該更新您listview改變它的數據。

您使用notelist.setAdapter(adapter);將您的數據綁定到您listview

所以刷新listView你必須通知adapter有事情發生,他應該利用adapter.notifyDataSetChanged();

你可以做這裏面的這個方法您listview class內部或adapter class

使用刷新適配器類:

public void updateAdapter(your_list arrylst) { 
    this.arrylst= arrylst; 

    //and call notifyDataSetChanged 
    notifyDataSetChanged(); 
} 

順便說一句你用壞getVeiw()方法,如谷歌I/O 2013說: 。

檢查this video for more info

希望幫助