2012-02-13 2 views
0

ユーザーがsource-SQLiteテーブルから行を削除した後でListViewを更新するのに苦労しています。ユーザーインタラクション後のListViewのリフレッシュ

私は数日間何か解決策を探して、notifyDataSetChanged()を使用することを推奨するいくつかの場所を発見しましたが、どこに配置し、使用するのか分からないようです。

私はBaseAdapterを使用しようとしていますが、これが正しく行われたことをLogCatで確認してもわかりません。

これは私が使用しているコードです:

ArrayList<HashMap<String,String>> results = new ArrayList<HashMap<String,String>>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    openAndQueryFav(); 
    displayResultList(); 


    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

    lv.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
       HashMap<String, String> item = (HashMap<String, String>) parent.getAdapter().getItem(position); 
       String Start = item.get("Start").toString(); 
       String Name = item.get("Name").toString(); 
       try{ 
        DBAdapter dbHelper = new DBAdapter(getBaseContext()); 
        newDB = dbHelper.getWritableDatabase(); 
        Cursor favorite = newDB.rawQuery("SELECT Start FROM " + 
          tableFav + " WHERE Start='" + Start + "'", null); 
        favorite.moveToFirst(); 

         if(favorite.getCount() > 0){ 
          newDB.execSQL("DELETE FROM " + 
            tableFav + " WHERE start='" + Start + "'"); 
          HeaderViewListAdapter adapterwrap = (HeaderViewListAdapter) parent.getAdapter(); 
          BaseAdapter adapter = (BaseAdapter) adapterwrap.getWrappedAdapter(); 

          adapter.notifyDataSetChanged(); 


         }else{ 

         } 
       }catch(Exception e){ 

        Log.d("Events", "catch, exception." + e.toString()); 
       }finally{ 

        newDB.close(); 
       } 
      } 
     }); 

} 



private void displayResultList() { 

    ListAdapter adapter = new SimpleAdapter(
      this, 
      results, 
      R.layout.list, 
      new String[] {"Start","Name","date"}, 
      new int[] {R.id.item_id,R.id.item_name,R.id.item_date} 
      ); 
    setListAdapter(adapter); 

    } 

を私が何かひどい間違ってやっている必要があります!ので、私はそれを実行しようとすると、私はLogCatでこれを取得する:

02-14 00:28:54.777: D/Events(9172): catch, exception.java.lang.ClassCastException: android.widget.SimpleAdapter 

と私は入れしようとした場合:

HeaderViewListAdapter adapterwrap = (HeaderViewListAdapter) parent.getAdapter(); 
BaseAdapter adapter = (BaseAdapter) adapterwrap.getWrappedAdapter(); 

試し{}外このエラーがLogCatである:

02-13 23:04:53.107: E/AndroidRuntime(9066): FATAL EXCEPTION: main 
02-13 23:04:53.107: E/AndroidRuntime(9066): java.lang.ClassCastException: android.widget.SimpleAdapter 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at com.myapplication.Favorite$1.onItemClick(Favoritter.java:74) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at android.widget.ListView.performItemClick(ListView.java:3382) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at android.os.Handler.handleCallback(Handler.java:587) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at android.os.Looper.loop(Looper.java:144) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at android.app.ActivityThread.main(ActivityThread.java:4937) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at java.lang.reflect.Method.invoke(Method.java:521) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
02-13 23:04:53.107: E/AndroidRuntime(9066):  at dalvik.system.NativeStart.main(Native Method) 

タスクが実行された後、私のリストビューが更新されるように、誰かを正しい方向に向けることができますか?

ありがとうございます!

答えて

0

私の問題の解決策が見つかりました。

私がこの問題を理解するのに使用したworking exampleが見つかりました。

主な違いは、私が望むデータベースに変更を加えた後、カーソル上で 'requery()'を使用することです。私に沿って支援しようとするために、あなた@Simonに

newDB = new DBAdapter(this.getApplicationContext()); 

     c = newDB 
     .getWritableDatabase() 
     .rawQuery("SELECT _ID, Start, Name, Time, Fav FROM " + 
       tableName + " WHERE Fav='1'" , null); 
     ListAdapter adapter = new SimpleCursorAdapter(
       this, 
       R.layout.list, c, 
       new String[] {"Start","Name","Time"}, 
       new int[] {R.id.item_id,R.id.item_name,R.id.item_time} 
       ); 
     setListAdapter(adapter); 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 

     lv.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
       String Start = c.getString(c.getColumnIndex("Start")); 
        try{ 
         newDB.getWritableDatabase().execSQL("UPDATE " + 
             tableName + " SET Fav='0' WHERE Start='" + Start + "'"); 
         c.requery(); 

        }catch(Exception e){ 

         Log.d("Events", "catch, exception." + e.toString()); 
        }finally{ 

        } 
       } 
      }); 

TNX:私は必要とされた変更をした後

これは、コードです!

0

UIを更新するものはすべてUIスレッドで実行する必要があります。これを試して。

runOnUiThread(new Runnable() { 
    public void run() { 
     adapter.notifyDataSetChanged(); 
    } 
}); 

データベースを変更するときに、あなたの場合には、アダプタに通知しなければならないようアダプタに基礎となるデータプロバイダは、直接変更された場合。これを行うためのよりクリーンな方法は、アダプタクラスを拡張し、挿入、追加、削除などをオーバーライドすることです。アダプタがバッキングデータが変更されていることを知っているので通知を行う必要はなく、自動的に。このアプローチのもう1つの利点は、データプロバイダの基礎となる実装を変更できることです。

+0

私は 'notifyDataSetChanged()'に関する提案を実装しようとしましたが、Hashmapでサポートされていないことがわかりました。私はアダプタクラスを拡張し、削除をオーバーライドすることをお勧めします、私はこれをどうやって?初心者の質問には申し訳ありません。 – Christoffer

関連する問題