0

注:これは、チェックボックスが邪魔になるスクロールの一般的な問題ではありません。

リストビュー行としてrelativelayout(テキストビューとチェックボックスを含む)を備えたリストビューアダプターがあり、ユーザーがリストビュー行をクリックするとチェックボックスが切り替わるようにしたいと思います。

今はほとんど機能していますが、画面から行をスクロールして戻ってくるまで、チェックボックスが切り替わったことを表示しません。そのため、適切に更新されていないようです。私の推測では、チェックボックスリスナーを使用して明示的に何か他のことを行う必要があります。これが私のコードです:

         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;
4

2 に答える 2

2

あなたはただそこに一線を忘れました!

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

タグを変更しただけで、チェックボックスは変更していません。それがリロードするときにそれが正しい理由です。

(バウンス:上記を2行に簡略化できます:

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

)。

于 2013-02-12T19:39:42.823 に答える
0

同様の機能を実装しました。listViewの行にチェックボックスがあります。したがって、このことを扱う場所は3つあります。

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

    }

ここで、問題は、チェックボックスをリスナー(リストビューのアクティビティ)に関連付ける方法です。さて、あなたがあなたのxmlチェックボックスをJavaのチェックボックスにバインドするところはどこでも、

私の場合、リストビューの行を表すカスタムViewクラスがあります。そのクラスのコンストラクターにアクティビティを渡します。このコンストラクターでは、OnCheckedChangeListenerを実装するアクティビティのCheckedChangedListenerとしてそのコンストラクターで使用されます。

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);

    }
}
于 2013-02-13T01:45:31.043 に答える