当前位置: 首页 > 知识库问答 >
问题:

如何在android searchable listview中保留选中的复选框?

梁丘凯定
2023-03-14

我有一个简单的搜索列表视图与复选框,但它不能记住我的选择,当它得到过滤。

主要活动。xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnChecked"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:foregroundGravity="center_horizontal"
        android:text="Get checked items"></Button>

    <EditText
        android:id="@+id/searchFilter"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="Search Ingredients"
        android:textColor="@color/material_on_surface_emphasis_medium" />

    <ListView
        android:id="@+id/lvMain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>
</LinearLayout>

主要活动。JAVA

package com.example.listview;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Filter;
import android.widget.ListView;

public class MainActivity extends Activity implements OnClickListener {

    final String LOG_TAG = "myLogs";

    ListView lvMain;
    String[] names;

    private ArrayAdapter<CharSequence> adapter;



    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText theFilter = (EditText) findViewById(R.id.searchFilter);

        lvMain = (ListView) findViewById(R.id.lvMain);
        // here we adjust list elements choice mode
        lvMain.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        // create adapter using array from resources file
        adapter = ArrayAdapter.createFromResource(
                this, R.array.names,
                android.R.layout.simple_list_item_multiple_choice);
        lvMain.setAdapter(adapter);

        Button btnChecked = (Button) findViewById(R.id.btnChecked);
        btnChecked.setOnClickListener(this);

        // get array from resources file
        names = getResources().getStringArray(R.array.names);

        theFilter.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {


                (MainActivity.this).adapter.getFilter().filter(charSequence);
                SparseBooleanArray scArray = lvMain.getCheckedItemPositions();




            }

            @Override
            public void afterTextChanged(Editable editable) {


                // Uncheck everything:

                for (int i = 0; i < lvMain.getCount(); i++) {
                    if (lvMain.isItemChecked(i)) {
                        lvMain.setItemChecked(i, true);
                    } else {
                        lvMain.setItemChecked(i, false);
                    }
                }
            }

        });
    }

    public void onClick(View arg0) {
        Log.d(LOG_TAG, "checked: ");
        SparseBooleanArray sbArray = lvMain.getCheckedItemPositions();
        for (int i = 0; i < sbArray.size(); i++) {
            int key = sbArray.keyAt(i);
            if (sbArray.get(key))
                Log.d(LOG_TAG, names[key]);
        }
    }
}

正如你在下面的图片中看到的,它不记得搜索后错误选择的“Petr”和“Ivan”。。。

共有1个答案

鄢飞鸾
2023-03-14

这是因为ArrayAdapter不支持此功能。您需要创建一个自定义适配器,该适配器将记住已检查的内容,以便它在重新绘制视图时不会采用默认值unchecked。

创建一个从BaseAdapter扩展的类,该类在ArrayList上工作

 类似资料:
  • 我有一个学生列表视图,每个行项目上都有一个开关和复选框以供学生出勤。我想保留滚动期间的开关框和复选框更改。我尝试了这种方法,但没有成功: 出勤率创建新.cs具有以下代码部分 谢谢。

  • 问题内容: 我有一个gridview,其中包含一个复选框列,也使用分页。当我在第一页中选中某些复选框并导航到第二页并在第二页中选中另一个复选框时,我在第一页中选中的选项不会保留在那里。分页期间可以保留复选框的值吗? Gridview的代码是 编辑: 用于记住gridview中所选选项的扩展,请检查此链接Selgridview 感谢 bool.dev 问题答案: 您可以使用会话/ cookie来存储

  • 我有一个选择框。有4个值(使用jstl标记生成),并且有加载按钮。 我正在单击load按钮调用struts操作 在struts操作类中,我添加了 现在我想在jsp页面中保留以前选择的值 我想与进行比较,而不是与Cloud进行比较。如何使用jstl(例如: 提前致谢

  • 我正在开发一个android烹饪应用程序(使用java),主页有一个回收器视图,其中填充了用户可以喜欢的食谱(类似于FaceBook帖子)。喜欢按钮是一个复选框,保存每个食谱的喜欢复选框状态的最佳方式是什么,所以当用户退出应用程序并再次登录时,他们不会多次喜欢同一个食谱。 在这种情况下,使用SharedReference是一个好主意吗? **im使用MySql作为数据库,不使用firebase。

  • 如何在TortoiseGit的拉对话框中保存/修复一些选中/未选中的选项?我团队中的一些人想要使用这个工具,如果他们不取消选中突出显示的选项,当前分支将被强制合并,并且HEAD每次都会丢失。 谢谢

  • 我正在使用datatable创建一个可排序、可搜索、可分页的表,表中的行是load serverside,我在每一行中添加了一个复选框,在表头中添加了一个check all复选框,我编写了一个自定义jquery函数来检查复选框的所有行,下面是我的代码: 问题是我的自定义检查全部功能无法检查数据表插件中的行的第2页,有没有什么方法可以克服这个问题?? 下面是我的HTML代码: