2013-03-05 16 views
5

Şu anda aptal bir sorunla karşı karşıyayım. Özel bir adaptörle (CursorAdapter'ı genişleterek) bir liste görüşüm var.CursorAdapter öğesinde bir öğeyi silme yönetimi nasıl yönetilir

Farklı düğmelerle (paylaş, beğen, sil) özel bir görünüm görüntüler. Silme düğmesi için, öğenin kaldırılmasını onaylamak için bir alertdialog vardır. Kullanıcı onayladıktan sonra, öğe db'den silinir. Her şey yoluna kadar iyi çalışıyor.

Soruma göre, yeni veri kümemi kullanarak liste listemi nasıl verimli bir şekilde güncelleyebilirim?

Yardımlarınız için çok teşekkürler.

Kodu:

public class CommentCursorAdapter extends CursorAdapter{ 
    (...) 
    @Override 
    public void bindView(View view, Context arg1, Cursor cursor) { 
    (...) 
     holder.list_item_comment_discard_btn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final String _id = v.getTag().toString(); 
      AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); 
      builder.setTitle("Delete"); 
      builder.setMessage("Do you want to delete "+_id); 
      builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // User clicked OK button 
        DBAdapter dba = new DBAdapter(mActivity); 
        dba.open(); 
        dba.remove(_id); 
        Log.i("TAAG", "removed: "+_id); 
        dba.close();  

       // How to update the listview ??          
       } 
      }); 
      builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // User cancelled the dialog 
       } 
      }); 

      AlertDialog d = builder.create(); 
      d.show(); 
     } 
     }); 
     holder.list_item_comment_discard_btn.setTag(_id); 
     (...) 
    } 
    (...) 
} 

cevap

9

(yeniden) onLoadFinished da adaptörün imleci ayarlayın. Liste görünümünüz güncellenmiş verilerle yeniden yüklenecek. etkinlik veya fragmanında bir imlecin

yönetimi çok basit ve anlaşılır bir şekilde yapılmalıdır:

  • imleci başlatmak amacıyla: o zaman

    public void onCreate(Bundle savedInstanceState) { // or onStart 
    // ... 
    this.getLoaderManager().initLoader(MY_CURSOR_ID, null, this); 
    // ... 
    } 
    
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    // TODO: create a cursor loader that will load your cursor here 
    } 
    
    public void onLoadFinished(Loader<Cursor> arg0, final Cursor arg1) { 
    // TODO: set your cursor as the cursor of your adapter here; 
    } 
    
    public void onLoaderReset(Loader<Cursor> arg0) { 
    // TODO: set null as the cursor of your adapter and 'free' all cursor 
    // references; 
    } 
    
  • Ve Verilerinizi yeniden yüklemeniz gerektiğinde:

    this.getLoaderManager().restartLoader(MY_CURSOR_ID, null, this); 
    
+1

i Bir öğeyi silindiğinde listeyi bildirmek için bağdaştırıcımdaki bir arabirimi uyguladıktan sonra, yükleyiciyi yeniden başlatıyorum. Şuan çalışıyor ;) – colletjb

1

Çağrı cursor.requery(); notifyDataSetChanged(); .

Gerçek performans istiyorsanız, AsyncTaskLoader kullanın. veri değişti Adapter anlatmak için notifyDataSetChanged() çağrı ardından

public void onClick(DialogInterface dialog, int id) { 
    // User clicked OK button 
    DBAdapter dba = new DBAdapter(mActivity); 
    dba.open(); 
    dba.remove(_id); 
    Log.i("TAAG", "removed: "+_id); 
    dba.close();  
    cursor.requery(); 
    notifyDataSetChanged();         
} 

ve ve tekrar adaptör inşa etmek vardır:

+0

kullanımdan kaldırıldı! – Online98

+0

Çalışmıyor! :( – Jorgesys

1

Bunun gibi Cursor yeniden sorgulamak.

Gereksinim uzun sürerse bu yoğun bir işlem olacaktır. Başka bir iş parçacığında yapmayı düşünün. Eğer, DB öğeyi silmek size CursorAdapter içinde bu yana this bir final başvuru ihtiyaç duyacakları kullanırken bu anonim iç sınıf ile verilen senin CommentCursorAdapter, üzerinde notifyDataSetChanged çağırdıktan sonra

+0

Test ettim, ama işe yaramadı. Ayrıca, cursor.requery() kullanımdan kaldırıldı :( – colletjb

+0

Eğer kullanımdan kaldırılmamışsa, bir "AsyncTaskLoader" gibi @Loxley kullanarak yeni bir imleci isteyebilirsiniz. Aşağıya cevap – tolgap

1

. Bu, ListView'unuzun yenilenmesini tetiklemelidir. Eğer o zaman restartLoader arayıp gereken tek (yani bunu yapmanın doğru yolu) imleçler yaşam döngüsünü yönetmek için LoaderManager kullanırsanız

http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

+0

Bunu başarılı olmadan denedim: '(: builder.setPositiveButton (android.R.string.ok, yeni DialogInterface.OnClickListener() { \t \t \t \t \t public void onClick (DialogInterface iletişim, int id) { \t \t \t \t \t \t // Kullanıcı \t \t \t \t \t \t DBAdapter dba = new DBAdapter (mActivity) Tamam düğmesine tıklandığında; \t \t \t \t \t dba.open(); \t \t \t \t \t dba.remove (_id); \t \t \t \t \t Log.i ("TAAG", "kaldırıldı:" + _id); \t \t \t \t \t dba.close(); \t \t \t \t \t \t \t \t \t \t \t \t \t \t cursor.requery(); \t \t \t \t \t mInstance.notifyDataSetChanged(); \t \t \t \t \t} \t \t \t \t}); – colletjb

İlgili konular