如何将listView中选中的item添加到ArrayList中?

How to add the checked item in listView to ArrayList?

我有一个包含 12 个项目的 ListView,每个项目都包含一个 TextView 和一个复选框。我设法使 CheckBox 检查状态保持不变,这样当我上下滚动时,我不会丢失为每个 CheckBox 设置的检查状态。

我现在面临的问题是,对于 ListView 中的每个项目,如果其对应的 CheckBox 被选中,我想将 TextView 添加到 ArrayList,如果相应的 CheckBox 未被选中,我应该从中删除 TextView ArrayList如果包含在里面。

在下面的 getView() 方法代码中,行 "Log.d(TAG, "chosen topic size: " + chosenTopics.size());"总是 returns 零??!!

请帮我解决这个问题。

getView():

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View view = null;

    if (convertView == null) {
        LayoutInflater layoutinflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        view = layoutinflater.inflate(R.layout.list_items_layout, null);

        final ViewHolder holder = new ViewHolder();

        holder.tv = (TextView) view.findViewById(R.id.tvlist_topic);
        holder.cb = (CheckBox) view.findViewById(R.id.cbList_hook);
        holder.iv = (ImageView) view.findViewById(R.id.ivList_delete);

        holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                ItemDesign element = (ItemDesign) holder.cb.getTag();
                element.setChecked(buttonView.isChecked());

                if(element.isChecked()) {
                    if (!chosenTopics.contains(designList.get(position).getTopic()))
                        chosenTopics.add(designList.get(position).getTopic());
                }

                if (!element.isChecked()) {
                    if (!chosenTopics.isEmpty()) {
                    if (chosenTopics.contains(designList.get(position).getTopic()))
                        chosenTopics.remove(position);
                    }
                }
            }
        });

        Log.d(TAG, "chosen topic size: " + chosenTopics.size());
        view.setTag(holder);
        holder.cb.setTag(designList.get(position));

    } else {
        view = convertView;
        ((ViewHolder) view.getTag()).cb.setTag(designList.get(position));
    }

    final ViewHolder holder = (ViewHolder) view.getTag();
    holder.tv.setText(designList.get(position).getTopic());
    holder.cb.setChecked(designList.get(position).isChecked());

    holder.iv.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (holder.cb.isChecked())
                holder.cb.setChecked(false);

            designList.remove(position);
            notifyDataSetChanged();
        }
    });

    return view;
}

LogCat 将 ArrayList 的初始化移动到构造函数后出现错误:

02-12 14:40:14.117: E/AndroidRuntime(22500): FATAL EXCEPTION: main
02-12 14:40:14.117: E/AndroidRuntime(22500): Process:  
com.example.mqtt_designlayout_02, PID: 22500
02-12 14:40:14.117: E/AndroidRuntime(22500):   
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
02-12 14:40:14.117: E/AndroidRuntime(22500):    at 
java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
02-12 14:40:14.117: E/AndroidRuntime(22500):    at 
java.util.ArrayList.remove(ArrayList.java:403)
02-12 14:40:14.117: E/AndroidRuntime(22500):    at 

com.example.mqtt_designlayout_02.listviewadapter.ListViewAdapter$1.onCheckedChanged(ListViewAdapter.java:95)

getView() method, the line "Log.d(TAG, "chosen topic size: " + chosenTopics.size());" always returns zero??!!

因为在 getView 方法中初始化 chosenTopics ArrayList,所以当 ListView 滚动时 up/down chosenTopics 对象再次初始化。取决于调用 getView 方法的次数。

解决问题移动

this.chosenTopics = new ArrayList<String>();

Adapter 构造函数内部的行