2013-02-12 2 views
0

Примечание. Это не распространенная проблема с прокруткой, которая приводит к потере флажков.android listview adapter checkbox refreshing

У меня есть адаптер listview с relativelayout (содержащий текстовое поле и флажок) в качестве строки списка, и я хочу сделать это, когда пользователь нажимает на строку listview ... тогда галочка будет переключаться.

У меня сейчас это работает почти, но что происходит, флажок не показывает мне, что он переключился, пока я не прокручу строку с экрана, а затем вернусь. Так кажется, что он не освежает должным образом. Я предполагаю, что мне нужно явно сделать что-то еще с помощью будильника. Вот мой код:

  ViewHolder holder = null; 
     MainContactsListOnOff entry = listMaincontactslistOnOff.get(position); 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      convertView = inflater.inflate(R.layout.contact_rowonoff, null); 

     holder = new ViewHolder(); 
     holder.code = (TextView) convertView.findViewById(R.id.textView1onoff); 
     holder.name = (CheckBox) convertView.findViewById(R.id.checkBox1onoff); 
     holder.img = (ImageView) convertView.findViewById(R.id.imageView1onoff); 
     convertView.setTag(holder);  

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
    holder.code.setText(entry.getName().toString()); 
    if(entry.getOnoff()==1){ 
     holder.img.setImageResource(R.drawable.green); 
    } else { 
     holder.img.setImageResource(R.drawable.red); 
    } 
    convertView.setId(entry.getDevID()); 
    holder.name.setTag(entry); 
    holder.name.setChecked(entry.getChecked()); 

    convertView.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       RelativeLayout rl = (RelativeLayout) arg0; 
       CheckBox chkBx = (CheckBox) rl.getChildAt(1); 
       MainContactsListOnOff mclOO = (MainContactsListOnOff) chkBx.getTag(); 
       if(chkBx.isChecked()){ 
        mclOO.setChecked(false); 
       } else { 
        mclOO.setChecked(true); 
       } 

      } 

     }); 
     return convertView; 

ответ

2

Вы просто забыли про линию!

if(chkBx.isChecked()){ 
       mclOO.setChecked(false); 
      } else { 
       mclOO.setChecked(true); 
      } 
chkBox.setChecked(!chkBx.isChecked()); //<-----Add this line to update the box state! :) 

Вы только изменили тег, но не установили флажок. Именно поэтому, когда он перезагружается, это будет правильно.

(Отказы: Вы можете упростить выше двух линий:

chkBox.setChecked(!chkBx.isChecked()); 
mclOO.setChecked(chkBox.isChecked()); 

)

+0

Внутри слушателя или снаружи? – milkboneUnderwear

+0

внутри конечно. – Edison

0

Я реализовал подобную функциональность - где я имел флажок в строке ListView. Итак, есть три места, которые имеют дело с этой вещью:

XML-файл: Отметить флажок как «фокусируемый» в row.xml (в моем случае это имя файла).

<CheckBox 
    android:id="@+id/on_off" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:focusable="false" /> 

Деятельность, которая будет получать щелчки флажков: Сделайте деятельность осуществлять OnCheckedChangeListener. Затем вам нужно будет реализовать свой метод onCheckedChanged().

@Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

     // here you receive clicks 
      // you can perform your desired action 

    } 

Теперь вопрос заключается в том, чтобы связать флажок со слушателем (который является ListView актив- ности). Ну, где бы вы не привязали ваш xml флажок к CheckBox в java, установите его

В моем случае у меня есть собственный класс View, представляющий строку listview. Я передаю действие конструктору этого класса, который затем используется в его конструкторе как CheckedChangedListener для действия, которое реализует OnCheckedChangeListener.

public class ListRow extends RelativeLayout { 

    // other elements 
    ... 
    private CheckBox OnOff; 

    public ListRow(Context context, ...) { 
     super(context); 


     LayoutInflater inflater = 
       (LayoutInflater)  context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.list_row, this, true); 
     ... 

     OnOff = (CheckBox) findViewById(R.id.on_off); 
     OnOff.setOnCheckedChangeListener((OnCheckedChangeListener) context); 

    } 
}