【问题标题】:how to keep selected checkboxes in android searchable listview?如何在android可搜索列表视图中保留选中的复选框?
【发布时间】:2021-12-29 13:09:27
【问题描述】:

我有一个带有复选框的简单可搜索列表视图,但是当它被过滤时它不记得我的选择。 当我过滤一个值并标记相关复选框时,清除搜索值后我的选择将不会保留...

activity_main.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>

MainActivity.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”...

【问题讨论】:

  • Maje a List of booleans that save which are checked, you'll need to create a custom Adapter.

标签: java android listview


【解决方案1】:

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

创建一个从 BaseAdapter 扩展的类,该类适用于 ArrayList&lt;Model&gt; 而不是字符串数组。在此模型中,您可以检查布尔值(最初全部为假)。这样,当用户滚动或搜索您的模型时,您的模型就会知道天气当前名称已被选中。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2015-02-24
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多