綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[求助] SearchView的Filter過濾

[複製連結] 查看: 25706|回覆: 0|好評: 0
跳轉到指定樓層
樓主
Joey0210 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2021-7-31 05:43

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
各位大大好~想請問Filter過濾器的寫法,已經花好多天爬文找範例、改程式碼,但只要一輸入關鍵字,整個APP就會跳掉....

在想是不是除了過濾文字,圖片也需要過濾??

我是用ListView(圖片+文字)排列清單
另外建Adapter+Filter的class,用傳入資料的方式使用(因為有兩個以上ListView共用同個Adapter)

程式碼如下:
XML:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#004B97"
    tools:context=".MainActivity2">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <ImageButton
                android:id="@+id/btn"
                android:layout_width="57dp"
                android:layout_height="56dp"
                android:src="@drawable/back" />

            <TextView
                android:id="@+id/tex"
                android:layout_width="wrap_content"
                android:layout_height="56dp"
                android:layout_weight="1"
                android:background="#FFFCEC"
                android:gravity="center"
                android:text="@string/deepsea"
                android:textSize="40sp" />

            <SearchView
                android:id="@+id/sv"
                android:layout_width="wrap_content"
                android:layout_height="56dp" />

        </LinearLayout>

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

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity:
package com.example.demo01;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;


public class MainActivity2 extends AppCompatActivity {
    public TextView tex;
    public ImageButton btn;
    public ListView lis;
    public SearchView sv;
    public List<Integer> fish_ps = new ArrayList();
    public List<String> fish_ns = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        setTitle("呆丸魚仔");

        fish_ps.add(R.drawable.dp1);fish_ps.add(R.drawable.dp2);fish_ps.add(R.drawable.dp3);fish_ps.add(R.drawable.dp4);
        fish_ps.add(R.drawable.dp5);fish_ps.add(R.drawable.dp6);fish_ps.add(R.drawable.dp7);fish_ps.add(R.drawable.dp8);
        fish_ps.add(R.drawable.dp9);fish_ps.add(R.drawable.dp10);

        fish_ns.add("三鑽光魚");fish_ns.add("大西洋鑽光魚");fish_ns.add("小月燈魚");fish_ns.add("孔頭底尾鱈");
        fish_ns.add("日本扁鯊");fish_ns.add("長刀光魚");fish_ns.add("臺灣扁鯊");fish_ns.add("裸頭大尾鱈");
        fish_ns.add("寬咽魚");fish_ns.add("褶胸魚");

        tex = findViewById(R.id.tex);
        btn = findViewById(R.id.btn);
        lis = findViewById(R.id.lis);
        sv = findViewById(R.id.sv);
        adp adp01 = new adp(fish_ps,fish_ns);
        lis.setAdapter(adp01);
        lis.setTextFilterEnabled(true);

        sv = findViewById(R.id.sv);
        sv.setQueryHint("魚仔名");
        sv.setSubmitButtonEnabled(false);
        sv.setIconifiedByDefault(true);
        sv.requestFocusFromTouch();

        tex.setTypeface(
                Typeface.createFromAsset(getAssets(),"fonts/typeface01.ttf")
        );
        
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent goback = new Intent(MainActivity2.this,MainActivity.class);
                startActivity(goback);
            }
        });

        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                adp01.getFilter().filter(newText);
                return true;
            }
        });
    }
   
}




另外建的Adapter+filter
package com.example.demo01;

import android.provider.UserDictionary;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.demo01.R;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;


public class adp extends BaseAdapter implements Filterable {
    List<Integer> mIcons;
    List<String> mWords;

    public adp(List<Integer> Icons, List<String> Words) {
        mIcons.addAll(Icons);
        mWords.addAll(Words);
    }

    @Override
    public int getCount() {
        return mIcons.size();
    }

    @Override
    public Object getItem(int position) {
        return mIcons.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {

            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.listlayout01, null);
        }
        ImageView fish_ms = convertView.findViewById(R.id.lis_img);
        TextView fish_ds = convertView.findViewById(R.id.lis_tex);

        fish_ms.setImageResource(mIcons.get(position));
        fish_ds.setText(mWords.get(position));

        return convertView;
    }


    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                ArrayList<String> filWords = new ArrayList<>();

                if (constraint == null || constraint.length() == 0) {
                    filWords.addAll(mWords);
                } else {
                    
                    for (String movie: mWords) {
                        if (movie.toLowerCase().contains(constraint.toString().toLowerCase())) {
                            filWords.add(movie);
                        }
                    }
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = filWords;

                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                mWords.clear();
                mWords.addAll((Collection<? extends  String>) results.values);
                notifyDataSetChanged();

            }
        };
        return filter;
    }
}





煩請各位高手指點迷津QQ






「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)
收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則