2013-12-23 2 views
0

Итак, мой вопрос заключается в регистрации щелчков checkBox в спискеView. В идеале я хочу что-то по строкам всего представления, заставляя checkBox включать/выключать. Единственный способ, с помощью которого я вижу эту работу, - это использовать функцию getView(), используя запас convertView с setOnClickListener, а затем вручную найти, какой вид и сменить checkBox. Есть ли способ лучше? Это кажется очень неэффективным.Лучший способ зарегистрировать checkbox в спискеView

ответ

0

Я сделал это так же, как вы описали. В документе XML, который вы надуть внутри getView() метода вашего адаптера, добавьте этот атрибут:

android:onClick="myMethod"; 

Тогда в вашей деятельности, объявить MyMethod, как это:

public void myMethod(View v) { 
    CheckBox cb = (CheckBox) v.findViewById(R.id.targetId); 
    cb.setChecked(!cb.isChecked); 
} 
+0

Это довольно элегантно. Я использую фрагменты, и я хочу, чтобы флажок был установлен на щелчке строки в спискеView, а не только на checkbox. Будет ли этот метод по-прежнему работать для этой ситуации? – cj1098

+0

Да, если вы установите атрибут 'onClick' в макет, который заполняет AdapterView, тогда он будет срабатывать независимо от того, что вы нажимаете, пока объект, на который вы щелкнете (является дочерним), соответствует макету, который использует' myMethod (View v) 'как метод onClick. – NitroNbg

1

То, что вы могли бы сделать, это определить настраиваемое представление:

checkable_row_view.xml:

<LinearLayout> 
    <Checkbox 
     android:id="@+id/checkbox/> 
    <TextView 
     android:id="@+id/textview/> 
</LinearLayout> 


public class CustomListviewItem extends LinearLayout implements Checkable{ 
    private TextView text; 
    private Checkbox checkbox; 
    private MyObject myObject; //the model class of the items you're displaying 

    public CustomListviewItem(Context context){ 
     super(context); 
    } 

    public CustomListviewItem(Context context, AttributeSet attrs){ 
     super(context, attrs); 
     LayoutInflater inflater = LayoutInflater.from(context); 
     inflater.inflate(R.layout.checkable_row_view, this); 
     text = findViewById(...); 
     checkbox = findViewById(...); 
    } 

    @Override 
    public boolean isChecked(){ 
     return myObject.isChecked(); 
    } 

    @Override 
    public void setChecked(boolean checked){ 
     myObject.setChecked(checked); 
     checkbox.setChecked(checked); 
    } 

    @Override 
    public void toggle(){ 
     myObject.setChecked(!myObject.isChecked()); 
     checkbox.setChecked(!checkbox.isChecked()); 
    } 

    public void setText(String text){ 
     this.text.setText(text); 
    } 


    public void setMyObject... 
} 

custom_item_view.xml:

<my.awesome.CustomListviewItem 
     width and height stuff here... /> 

в адаптере:

static class ViewHolder{ 
    public CustomListviewItem customListviewItem; 
} 

@Override 
public View getView(position, convertView, parent){ 
    //do viewholder stuff 

holder.customListviewItem.setText(theText); 
holder.customListviewItem.setChecked(shouldBeChecked) 
} 

Убедитесь, что установлен режим выбора вашего ListView в CHOICE_MODE_MULTIPLE и использовать R.layout.custom_item_view в качестве макета элемента в адаптере.

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