You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在后续Activity中展示已勾选的ListView项

嘿,我来帮你搞定把ListView勾选项传到另一个Activity展示的需求!咱们一步步来调整你的CursorAdapter,再处理数据传递和展示逻辑:

第一步:修复CursorAdapter的选中状态记录(解决视图复用坑)

因为CursorAdapter的列表项视图会被复用,直接靠位置记录选中状态肯定会乱套,咱们得绑定到数据的唯一标识(比如数据库表里的_id字段)。调整后的MyCursorAdapter代码如下:

class MyCursorAdapter extends CursorAdapter {
    private LayoutInflater inflater;
    // 用HashSet存选中项的唯一ID,避免重复,判断效率也更高
    private HashSet<Long> selectedItemIds = new HashSet<>();
    private Context context;

    public MyCursorAdapter(Context context, Cursor cursor) {
        super(context, cursor, 0);
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        // 替换成你的列表项布局ID
        return inflater.inflate(R.layout.your_list_item_layout, parent, false);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView tv1 = view.findViewById(R.id.tv1);
        TextView tv2 = view.findViewById(R.id.tv2);
        TextView tv3 = view.findViewById(R.id.tv3);
        CheckBox checkBox = view.findViewById(R.id.checkbox);

        // 获取当前项的唯一ID(替换成你数据库里的主键字段)
        long itemId = cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
        // 获取三个TextView对应的字段内容(替换成你的实际列名)
        String text1 = cursor.getString(cursor.getColumnIndexOrThrow("column_name1"));
        String text2 = cursor.getString(cursor.getColumnIndexOrThrow("column_name2"));
        String text3 = cursor.getString(cursor.getColumnIndexOrThrow("column_name3"));

        // 设置文本内容
        tv1.setText(text1);
        tv2.setText(text2);
        tv3.setText(text3);

        // 关键:恢复Checkbox状态,避免滚动时状态错乱
        checkBox.setChecked(selectedItemIds.contains(itemId));

        // 监听Checkbox勾选变化
        checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if (isChecked) {
                selectedItemIds.add(itemId);
            } else {
                selectedItemIds.remove(itemId);
            }
        });
    }

    // 对外提供获取选中项ID的方法
    public HashSet<Long> getSelectedItemIds() {
        return selectedItemIds;
    }

    // 也可以直接获取选中项的完整文本数据(按需选择)
    public ArrayList<String[]> getSelectedItemsData() {
        ArrayList<String[]> selectedData = new ArrayList<>();
        Cursor cursor = getCursor();
        if (cursor != null && cursor.moveToFirst()) {
            do {
                long itemId = cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
                if (selectedItemIds.contains(itemId)) {
                    String text1 = cursor.getString(cursor.getColumnIndexOrThrow("column_name1"));
                    String text2 = cursor.getString(cursor.getColumnIndexOrThrow("column_name2"));
                    String text3 = cursor.getString(cursor.getColumnIndexOrThrow("column_name3"));
                    selectedData.add(new String[]{text1, text2, text3});
                }
            } while (cursor.moveToNext());
        }
        return selectedData;
    }
}
第二步:从第一个Activity传递选中数据到第二个Activity

假设你有个按钮(比如“查看已选”),点击后跳转,在点击事件里这么处理:

// 假设你的ListView实例是listView,适配器是myAdapter
Button viewSelectedBtn = findViewById(R.id.btn_view_selected);
viewSelectedBtn.setOnClickListener(v -> {
    // 获取选中的完整文本数据
    ArrayList<String[]> selectedData = myAdapter.getSelectedItemsData();
    
    // 用Intent传递数据(String[]可序列化,直接放就行)
    Intent intent = new Intent(this, YourSecondActivity.class);
    intent.putExtra("SELECTED_ITEMS", selectedData);
    startActivity(intent);
});

如果选中项很多,推荐传递ID而非完整数据,然后在第二个Activity去数据库查询:

// 把HashSet转成ArrayList(HashSet不能直接序列化)
ArrayList<Long> selectedIds = new ArrayList<>(myAdapter.getSelectedItemIds());
intent.putExtra("SELECTED_ITEM_IDS", selectedIds);
第三步:在第二个Activity展示已选中项

先给第二个Activity写个简单的布局(比如activity_selected.xml):

<ListView
    android:id="@+id/list_selected_items"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"/>

然后写第二个Activity的代码:

public class YourSecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_selected);

        ListView selectedListView = findViewById(R.id.list_selected_items);
        
        // 获取传递过来的选中数据
        ArrayList<String[]> selectedData = (ArrayList<String[]>) getIntent().getSerializableExtra("SELECTED_ITEMS");
        
        // 创建适配器展示数据
        ArrayAdapter<String[]> adapter = new ArrayAdapter<String[]>(this, R.layout.item_selected, selectedData) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView == null) {
                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_selected, parent, false);
                }
                TextView tv1 = convertView.findViewById(R.id.tv_selected1);
                TextView tv2 = convertView.findViewById(R.id.tv_selected2);
                TextView tv3 = convertView.findViewById(R.id.tv_selected3);
                
                String[] item = getItem(position);
                tv1.setText(item[0]);
                tv2.setText(item[1]);
                tv3.setText(item[2]);
                
                return convertView;
            }
        };
        
        selectedListView.setAdapter(adapter);
    }
}

对应的item_selected.xml就是三个TextView的布局,和原列表行类似就行。

小提醒
  • 如果数据库数据可能在跳转前更新,优先传递ID,在第二个Activity重新查询,数据更准确
  • 确保Cursor在使用时处于有效状态(别在关闭后调用)
  • 若选中项数量大,传递ID比完整数据更省资源

内容的提问来源于stack exchange,提问作者aditya kumar singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:41:38