安卓:ListView 多选

3

问题:

当我在列表视图中点击第二个复选框项目时,第十个项目会自动被选中。我不明白发生了什么?

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.TextView;

public class ItemAdapter extends ArrayAdapter<MyItem> {
private int resId;
Context context;
private ArrayList<MyItem> itemList;

public ItemAdapter(Context context, int textViewResourceId,
        List<MyItem> objects) {
    super(context, textViewResourceId, objects);
    this.context = context;
    this.resId = textViewResourceId;
    this.itemList = new ArrayList<MyItem>();
    this.itemList.addAll(objects);
}

private class ViewHolder {
    public boolean needInflate;
    public TextView txtItemName;
    public CheckBox chkItem;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    MyItem cell = (MyItem) getItem(position);
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.listitem, null);
        holder = new ViewHolder();
        holder.txtItemName = (TextView) convertView
                .findViewById(R.id.tvItemName);
        holder.chkItem = (CheckBox) convertView.findViewById(R.id.chkItem);
        holder.chkItem
                .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        //Log.i("Pos", "" + position);
                        //cell.setSelected(buttonView.isChecked());
                    }
                });
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.txtItemName.setText(cell.getName());
    return convertView;
  }
}

"MyItem"是我的POJO类。
OnCreate代码:
 lvItemName = (ListView) findViewById(R.id.lvItemName);
    List<MyItem> myItemsList = new ArrayList<MyItem>();

    for (int i = 0; i < items.length; i++) {
        MyItem item = new MyItem(items[i], false);
        myItemsList.add(item);
    }

    ItemAdapter adapter = new ItemAdapter(this, R.layout.listitem,
            myItemsList);
    lvItemName.setAdapter(adapter);
    lvItemName.setOnItemClickListener(this);

"items" 是我的字符串数组。
提前感谢。

请点击以下链接查看相关的编程内容:https://dev59.com/PGMl5IYBdhLWcg3wwZEq#18164177。如果有帮助,请查看。 - Raghunandan
也许这可以帮助你:https://dev59.com/8nM_5IYBdhLWcg3wfTA0 - Alexfr8
1
@lawrance:你没有在选中的项目位置上设置标签。我在我的答案中建议了一个链接来解决你的问题。 - user755
是的,@user2439755,你说得对。我通过添加“holder.chkItem.setTag(position);”解决了我的问题。谢谢。 - Dhruv
1
@Lawrence 请查看这个答案,它可能会有所帮助:https://dev59.com/wXbZa4cB1Zd3GeqPBhOd#20171191 - Chanakya Vadla
显示剩余2条评论
3个回答

1
我希望您能通过添加布尔数组来避免这个问题。
boolean[] checkboxState=new boolean['your array size here']; //global decleration
holder.checkBox.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

                if (((CheckBox) v).isChecked()) {
                    checkboxState[position] = true;


                } else
                    checkboxState[position] = false;

这对我有效,希望这能帮助你..

0

在选定的项目位置设置标签。

查看此处完整的工作示例。


0
在你的ListView的getView方法中,将holder.checkbox设置为setTag(position)
然后使用getTag()方法获取该position,你就可以在那里得到所选的位置,从而解决你的问题。请阅读有关setTag(value)getTag()方法的相关信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接