2014-09-29 3 views
0

Облицовка очень странной проблемы. У меня есть listview с checkbox на каждый предмет, когда я нажимаю на первый элемент listview, он выбирается, но вместе с этим пунктом также выбирается последний элемент списка! когда я просматриваю список. Без прокрутки он отлично работает.Неверный элемент, выбранный в Listview onItemClick

Также, когда я выбираю последний элемент, первый элемент выбирается вместе с ним после прокрутки. Напоминаем, что все остальные элементы между этими первыми и последними работают правильно. И забавная часть, после выбора первого или последнего элемента, , если я не прокручиваю listview в течение 2-3 секунд, он отлично работает, а затем. Так что я ожидаю, что это может быть проблемой рендеринга представления или несколько. Может кто-нибудь указать мне, что, черт возьми, здесь происходит ..

Cursor cursor = queryDatabase(); 

    // The desired columns to be bound 
     String[] columns = new String[] {    
     DataBaseHelper.ROW_PROFILE_NAME, 
     DataBaseHelper.ROW_PROFILE_TYPE, 
     DataBaseHelper.ROW_ID 
     }; 

     // the XML defined views which the data will be bound to 
     int[] to = new int[] { 
     R.id.profileName, 
     R.id.profileStatus 
     }; 

     // create the adapter using the cursor pointing to the desired data 
     //as well as the layout information 
     mAdapter = new SimpleCursorAdapter(
     this, R.layout.profile_listview_delete_item, 
     cursor, 
     columns, 
     to, 
     0); 

     listView = (ListView) findViewById(R.id.profile_listview_delete_main); 
     // Assign adapter to ListView 
     listView.setAdapter(mAdapter); 

     listView.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
      // TODO Auto-generated method stub 

      CheckBox cb;     

      Cursor c = mAdapter.getCursor(); 
      String prodile_id = c.getString(c.getColumnIndex(DataBaseHelper.ROW_ID)); 

      cb = (CheckBox)arg1.findViewById(R.id.checkbox); 
      cb.toggle(); 

      if(cb.isChecked()) 
      {     
       profileStack.add(prodile_id);     
       //Toast.makeText(getApplicationContext(), String.valueOf(profileStack), Toast.LENGTH_LONG).show();     
       counter++;    
      } 
      else if(!cb.isChecked()) 
      { 
       profileStack.remove(prodile_id);      
       //Toast.makeText(getApplicationContext(), String.valueOf(profileStack), Toast.LENGTH_LONG).show();     
       counter--;     
      }    
      countSelectedItem.setText(String.valueOf(counter)+" items selected"); 

      mAdapter.notifyDataSetChanged();         
     } 
    }); 
+0

Можете ли вы опубликовать ваш класс адаптера Я думаю, что это проблема шаблона View Holder? – Rajesh

+0

@ Rajesh, я использую SimpleCursorAdapter, как вы можете видеть код выше. – ridoy

+0

Ваш код неправильный. Вы должны использовать пользовательский адаптер с классом viewholder. Из этого адаптера, изменяя значение вашего флажка, вы должны изменить значение поля из вашего адаптера в отношении этого флажка. После нажатия кнопки listview получите позицию и получите значения из вашего адаптера. – Gunaseelan

ответ

1

Вы должны использовать пользовательские Adapter (и класс модели это optional. Здесь TemaRescatado модель класса во фрагменте кода) для этого. В getView(...) вы должны использовать CompoundButton.OnCheckedChangeListener попробовать использовать ViewHolder pattern

фрагмент кода

viewHolder.checkbox = (CheckBox) view.findViewById(R.id.checkBox1); 
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, 
     boolean isChecked) { 
     TemaRescatado element = (TemaRescatado) viewHolder.checkbox 
        .getTag(); 
     element.setSelected(buttonView.isChecked()); 

     } 
     }); 
+0

Невозможно исправить проблему с помощью текущего кода? Потому что я сказал, что все остальные товары работают хорошо. – ridoy

+2

Я не уверен, но лучше не использовать пользовательский адаптер, потому что он оптимизирует ваш код и реализует шаблон 'ViewHolder'. Свиток' ListView' будет * плавным * – kId

+0

u можно попробовать с помощью функции 'mAdapter.notifyDataSetInvalidated() 'после' notifyDataSetChanged() '. – kId

1

Вы должны получить курсор из AdapterView, который передается в качестве аргумента в onItemClick метод.

Измените код.

Cursor c = mAdapter.getCursor(); 

в

Cursor c = (Cursor) arg0.getItemAtPosition(position); 
+0

Нет, это не меняет ситуацию. – ridoy

+0

Обновлен мой ответ, проверьте это и дайте мне знать, что это не работает. –

+0

Нет, он не работает. По-прежнему то же самое, проверьте 1-й пункт, а затем прокрутите, увидите последний элемент, который также выбран! Но проверьте 1-й пункт, подождите 2 секунды, прокрутите страницу, а затем увидите, что она работает хорошо! странно! – ridoy

0

Эта проблема происходит из-за утилизации ListView «s. Он повторно использует первый видимый View s, как только он не отображается, чтобы показывать следующие данные адаптера. Поэтому, когда вы проверяете и устанавливаете флажок в отношении данных в позиции List. он останется таким же, как вы его оставили. Так Мое решение этого вопроса:

в адаптерах getView()

поставить простое, если-иначе заявление проверить, если флажок должен быть проверен или не нравится:

// note that this is a pseudo code 
if(ID exist in profileStack){ 
//set checkBox 
} 
else{ 
//set checkBox 
} 
Смежные вопросы