簡體   English   中英

如何在 android 可搜索列表視圖中保留選中的復選框?

[英]how to keep selected checkboxes in android searchable listview?

我有一個帶有復選框的簡單可搜索列表視圖,但是當它被過濾時它不記得我的選擇。 當我過濾一個值並標記相關復選框時,清除搜索值后我的選擇將不會保留...

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

搜索前

選擇過濾值

清除搜索后選擇錯誤

這是因為ArrayAdapter不支持這個。 您需要創建一個自定義適配器,該適配器將記住已檢查的內容,以便在重繪視圖時不會采用未選中的默認值。

創建一個從 BaseAdapter 擴展的BaseAdapter ,它適用於ArrayList<Model>而不是字符串數組。 在此 Model 中,您可以檢查 boolean(最初全部為假)。 這樣,當用戶滾動或搜索您的 model 時,就會知道當前天氣名稱已被選中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM