2010-10-24 20 views
8

SimpleCursorAdapter öğesini genişleterek özel bir ListView oluşturdum. Sonuç, IMAGE + CheckedTextView (Metin + Onay Kutusu).Android Listeye tıklayınSil kontrolleri onay kutusunu işaretleyin

Bir Öğeyi uzun tıklattığımda, her şey iyi çalışıyor - Doğru kimliği ve tıklanan Öğenin ayrıntılarını alıyorum.

Bir Öğeyi işaretli olarak işaretlemeye çalıştığımda sorun çıkıyor, ancak yanlış onay kutusunu işaretliyor.

Örneğin: Listemde 9 öğe var, 1-9. listItem 1'i tıklarsam, 9 numaralı satırdaki onay kutusu denetleniyor. 4. maddeye tıklarsam satır 6'daki onay kutusu kontrol edilir ve orta hatta tıklarsam kontrol edilir.

Açıkçası burada bir şeyi özlüyorum :) Satırı uzun tıklattığımı hatırlıyorum (contextMenu açılır), her şey harika çalışıyor.

lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle); 

       if (!markedItem.isChecked()) { 
        markedItem.setChecked(true); 
       } else { 
        markedItem.setChecked(false); 
       } 

      } 
     }); 

herhangi bir yardım takdir:

Bu dinleyicidir!

Bana daha fazla kod göndermeme ihtiyacınız varsa bildirin.

Teşekkür ederiz! Adaptör kodu

public class ImageCursorAdapter extends SimpleCursorAdapter { 

    private Cursor c; 
    private Context context; 

    private String url; 
    private TextView bUrl; 

    public ImageCursorAdapter(Context context, int layout, Cursor c, 
      String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     this.c = c; 
     this.context = context; 
    } 

    public View getView(int pos, View inView, ViewGroup parent) { 
     View v = inView; 
     if (v == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.image_list, null); 
     } 

     this.c.moveToPosition(pos); 

     final TextView bTitle = (TextView) v.findViewById(R.id.btitle); 
     String bookmark = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.TITLE)); 


     byte[] favicon = this.c.getBlob(this.c.getColumnIndex(Browser.BookmarkColumns.FAVICON)); 

     if (favicon != null) { 
      ImageView iv = (ImageView) v.findViewById(R.id.bimage); 
      iv.setImageBitmap(BitmapFactory.decodeByteArray(favicon, 0, favicon.length)); 
     } 
     bTitle.setText(bookmark); 

     return (v); 
    } 
} 
+0

Bize bağdaştırıcınızı göster – Falmarri

+0

düzenlenmiş soru. Teşekkürler. –

+0

Dinleyicideki pozisyon değerini kaydediyor musunuz? Başka dinleyicin var mı? – Jim

cevap

11

Mayra haklı - Sorunu: Birden fazla fikir tıklarsanız

btw ... TARAF belirgin düzen ...

DÜZENLEME ... devam ListView görünümlerinizi yeniden kullanma şekliyle ilgilidir. Görüntüleme başına bir tane olan CheckedTextView nesnesinin 9 örneği varmış gibi değil. Bunun yerine, tüm satırlarda yeniden kullanılan tek bir tane var. Böylece bir maddenin kontrol edilip edilmediğini kontrol etmek için CheckedTextView nesnesine güvenemezsiniz. Sen, belirli satır Örneğin işaretli olup olmadığını tutmak için bazı ek veri yapısını gerekir ith satır kontrol edilmelidir IFF ith eleman doğrudur

ArrayList<Boolean> checkedStates = new ArrayList<Boolean>(); 

. Sonra itemClickListener içinde: Sonra görünüm kodu içinde

lv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      boolean currentlyChecked = checkedStates.get(position); 
      checkedStates.set(position, !currentlyChecked); 
      // Refresh the list 
     } 
    }); 

:

public View getView(int pos, View inView, ViewGroup parent) { 
    View v = inView; 
    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.image_list, null); 
    } 

    this.c.moveToPosition(pos); 

    final TextView bTitle = (TextView) v.findViewById(R.id.btitle); 
    String bookmark = this.c.getString(this.c.getColumnIndex(Browser.BookmarkColumns.TITLE)); 


    byte[] favicon = this.c.getBlob(this.c.getColumnIndex(Browser.BookmarkColumns.FAVICON)); 

    if (favicon != null) { 
     ImageView iv = (ImageView) v.findViewById(R.id.bimage); 
     iv.setImageBitmap(BitmapFactory.decodeByteArray(favicon, 0, favicon.length)); 
    } 
    bTitle.setText(bookmark); 


    // Change the state of the checkbox to match that of the row's checked state. 
    // This check box item is reused for every row, so we need to reset its state each 
    // time the row is rendered. 
    CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle); 
    markedItem.setChecked(checkedStates.get(pos)); 


    return (v); 
} 

Bu sorunu çözmek gerekir. Alternatif bir yaklaşım, sıranın kontrol edilip edilmediğini veya satırın temsil ettiği alan nesnesinin mantığını hareket ettirmek olacaktır. Bu benim tercihim olurdu.

+0

Cevap verdiğiniz için teşekkür ederiz! Önerilerinizi denedim ve ne yaptığım önemli değil "IndexOutOfBoundsExeption" için bir Force Close var. Herhangi bir fikrin var mı? –

+0

Bir noktada ilk girişleri ArrayList'e eklemeniz gerekir. Ne kadar öğe bulunduğunu bildiğinizde, örneğin, (int i = 0; i I82Much

+0

Tamam çok teşekkür ederim. bunu deneyecek! –

İlgili konular