0

Я знаю, что есть много вопросов, связанных с Custom ListView с CheckBox, но все же я получаю некоторую проблему при извлечении всех отмеченных элементов.Пользовательский ListView с CheckBox

Что я делаю это:

Отображение пользовательских ListView из базы данных (Список всех отправленных SMS-сообщений).

Позвольте пользователю проверить различные элементы списка.

Когда пользователь нажимает на кнопку Удалить, я хочу, чтобы удалить все выбранные элементы (из базы данных, а также вид на участок)

Проблема: Когда я иду в операцию в первый раз и проверки некоторые элементы, и удалите его, он отлично работает.

Но когда я снова проверить некоторые пункты только после нажатия кнопки удаления, некоторые пункты получают проверены и некоторые получает бесконтрольно и снова некоторые другие элементы будут удалены ..

Я думаю, что я не в состоянии связать ID и элемент списка совершенно ..

Кодирование сделано до сих пор:

row.xml содержит

ImageView 
TextView 
TextView 
TextView 
CheckBox 

В моем классе активности:

Uri uriSms = Uri.parse("content://sms/sent"); 
Cursor cursor = context.getContentResolver().query(uriSms, null,null,null,null); 
String[] from={"address","body"}; 
int[] to={R.id.contactName,R.id.msgLine}; 
ssa=new SentSmsAdapter(context,R.layout.inbox_list_item,cursor,from,to,2); 
smsList.setAdapter(ssa); 

deleteSms.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 

       ArrayList<Boolean> list=SentSmsAdapter.itemChecked; 

       Uri path=Uri.parse("content://sms/"); 
       for(int i=0;i<list.size();i++) 
       { 
        if(list.get(i)) 
         getContentResolver().delete(path,"_id="+ssa.getItemId(i),null); 
       } 

       ssa.notifyDataSetChanged(); 
} 

У меня есть пользовательское SimpleCursorAdapter.

public class SentSmsAdapter extends SimpleCursorAdapter{ 

    Cursor dataCursor; 
    LayoutInflater mInflater; 
    Context context; 
    int layoutType; 
    ArrayList<String> arrayList; 
    public static HashMap<String,Long> myList=new HashMap<String,Long>(); 

    public static ArrayList<Boolean> itemChecked = new ArrayList<Boolean>(); 
    public static ArrayList<Long> itemIds=new ArrayList<Long>(); 

    public SentSmsAdapter(Context context, int layout, Cursor dataCursor, String[] from, 
        int[] to,int type) { 
      super(context, layout, dataCursor, from, to); 


      layoutType=type; 
      this.context=context; 
      this.dataCursor = dataCursor; 
    mInflater = LayoutInflater.from(context); 

    arrayList=new ArrayList<String>(); 

    for (int i = 0; i < this.getCount(); i++) { 
     itemChecked.add(i, false); 
    } 

    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

      final ViewHolder holder; 

      if(convertView==null) 
      { 
        convertView = mInflater.inflate(R.layout.inbox_list_item, null); 
      holder = new ViewHolder(); 

      holder.checkBox=(CheckBox) convertView.findViewById(R.id.checkMsg); 
      holder.checkBox.setTag(position); 
      holder.cName=(TextView)convertView.findViewById(R.id.contactName); 
      holder.icon=(ImageView)convertView.findViewById(R.id.msgImage); 
      holder.msg=(TextView)convertView.findViewById(R.id.msgLine); 
      holder.time=(TextView)convertView.findViewById(R.id.msgTime); 



      convertView.setTag(holder); 
      holder.checkBox.setTag(itemChecked.get(position)); 
      } 
      else 
      { 
        holder=(ViewHolder)convertView.getTag(); 
      } 

       holder.checkBox.setOnClickListener(new OnClickListener(){ 


            @Override 
            public void onClick(View view) { 
              // TODO Auto-generated method stub 
              CheckBox cb = (CheckBox) view.findViewById(R.id.checkMsg); 
              int pos=Integer.parseInt(holder.checkBox.getTag()); 

            itemChecked.set(position, cb.isChecked()); 

              /*if (cb.isChecked()) { 
            itemChecked.set(position, true); 

            Log.i("WhenChecked",Boolean.toString(itemChecked.get(position))); 
            // do some operations here 
           } 
              else if (!cb.isChecked()) { 
            itemChecked.set(position, false); 
            Log.i("WhenNotChecked",Boolean.toString(itemChecked.get(position))); 
            // do some operations here 
           } 
            */ 

            } 
          }); 

      dataCursor.moveToPosition(position); 

      String id=Integer.toString(dataCursor.getInt(dataCursor.getColumnIndexOrThrow("_id"))); 
      itemIds.add(Long.parseLong(id)); 

      String msgText=dataCursor.getString(dataCursor.getColumnIndexOrThrow("body")); 
      holder.msg.setText(msgText); 

      Long time=dataCursor.getLong(dataCursor.getColumnIndexOrThrow("date")); 
      holder.time.setText(Long.toString(time)); 

      String address=dataCursor.getString(dataCursor.getColumnIndexOrThrow("address")); 

      Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));   
      Cursor cs= context.getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME},null,null,null); 

      if(cs.getCount()>0) 
        address=cs.getString(cs.getColumnIndex(PhoneLookup.DISPLAY_NAME)); 

      cs.close(); 
      holder.cName.setText(address); 


      if(layoutType==1)holder.checkBox.setVisibility(View.GONE); 
      else 
      { 
        holder.checkBox.setVisibility(View.VISIBLE); 
      } 
      arrayList.add(id+","+address+","+msgText+","+Long.toString(time)); 
      return convertView; 
    } 

    static class ViewHolder 
    { 
      ImageView icon; 
      CheckBox checkBox; 
      TextView cName; 
      TextView msg; 
      TextView time; 
    } 

    @Override 
    public Object getItem(int position) { 
      // TODO Auto-generated method stub 
      return arrayList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return itemIds.get(position); 
    } 

}

ответ

4

Попробуйте что-нибудь в этом роде.

добавить этот код в GetView()

holder.checkBox.seTag(position); 
holder.checkBox.setOnCheckedChangedListener(this); 

реализовать эту внешнюю GetView().

public void onCheckedChanged(CompoundButton view,boolean isChecked) { 

    if(isChecked) 
    { 
     itemChecked.add(view.getTag());       
    } 
    else 
    { 
     if(itemChecked.cantains(view.getTag())) 
      //remove from itemChecked. 
    } 
} 

При удалении удалите все элементы из списка, индекс которого доступен в itemChecked.

Спасибо и N-JOY.

+0

У меня есть класс, похожий на класс Kartik, но я использую ArrayAdapter. Когда щелкнули один из checkbox, событие onCheckChanged вызывается для всех из них. Тот факт, что я использую ArrayAdapter, не должен менять это право? –

+1

Я использовал onClick вместо onCheckedChanged, как я читал здесь (http://stackoverflow.com/questions/5438375/custom-listview-with-checkbox-problem), и я получил его работу. –

0

Если вы используете темы при проверке, uncheking и удаление этих элементов, они будут работать должным образом.

 Смежные вопросы

  • Нет связанных вопросов^_^