Android 台灣中文網
標題:
SearchView的Filter過濾
[打印本頁]
作者:
Joey0210
時間:
2021-7-31 05:43
標題:
SearchView的Filter過濾
各位大大好~想請問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 台灣中文網 (https://apk.tw/)
Powered by Discuz! X3.1