Android自定义ListView:添加搜索功能
Posted
技术标签:
【中文标题】Android自定义ListView:添加搜索功能【英文标题】:Android custom ListView: adding search function 【发布时间】:2014-04-15 07:35:21 【问题描述】:我有一个问题,我希望在我的 ListView 上方有一个 EditText,它在该 ListView 中执行搜索。有可能吗?
这是活动代码:
public static class BirreChiareListView extends Main implements AdapterView.OnItemClickListener
ListView list;
String [] birrechiare;
int [] images=R.drawable.ichnusa, R.drawable.ichnusa_speciale, R.drawable.ichnusa_cruda;
private MyAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(birrechiare_listview);
Resources res=getResources();
birrechiare=res.getStringArray(R.array.birre_chiare);
list = (ListView)findViewById(R.id.listViewBirreChiare);
MyAdapter adapter = new MyAdapter(this,birrechiare, images);
list.setAdapter(adapter);
list.setOnItemClickListener(this);
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long l)
String item = adapter.getItemAtPosition(position).toString();
Toast.makeText(getApplicationContext(), "Hai selezionato: " + item, Toast.LENGTH_SHORT).show();
if (position == 0)
Intent gotoclassica = new Intent(BirreChiareListView.this,Ichnusa_Classica.class);
startActivity(gotoclassica);
if (position == 1)
Intent gotospeciale = new Intent(BirreChiareListView.this,Ichnusa_Speciale.class);
startActivity(gotospeciale);
if (position == 2)
Intent gotocruda = new Intent(BirreChiareListView.this,Ichnusa_Cruda.class);
startActivity(gotocruda);
static class MyAdapter extends ArrayAdapter<String>
Context context;
int[] images;
String[] titleArray;
MyAdapter(Context c, String[] titles, int imgs [])
super (c, single_row, R.id.Titletxt, titles);
this.context = c;
this.images=imgs;
this.titleArray=titles;
@Override
public View getView (int position, View convertView, ViewGroup parent)
LayoutInflater inflater = (LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);
View row=inflater.inflate(single_row, parent,false);
ImageView myimage = (ImageView) row.findViewById(R.id.imageView);
TextView mytitle = (TextView) row.findViewById(R.id.Titletxt);
myimage.setImageResource(images[position]);
mytitle.setText(titleArray[position]);
return row;
好的,这是 ListView 的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical"
android:background="@drawable/background_listview">
<TextView
android:layout_
android:layout_
android:text="Birre Chiare"
android:singleLine="false"
android:textColor="#FFFFFF"
android:gravity="center"/>
<EditText
android:id="@+id/search"
android:layout_
android:layout_ >
<requestFocus />
</EditText>
<ListView
android:id="@+id/listViewBirreChiare"
android:layout_
android:layout_>
</ListView>
</LinearLayout>
最后,这是 single_row.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_ android:layout_>
<ImageView
android:layout_
android:layout_
android:id="@+id/imageView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:src="@drawable/ichnusa"/>
<TextView
android:layout_
android:layout_
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/Titletxt"
android:layout_alignBottom="@+id/imageView"
android:layout_toRightOf="@+id/imageView"
android:layout_marginBottom="35dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
【问题讨论】:
【参考方案1】:是的,这绝对是可以做到的。 Android 为ArrayAdapter
s 提供了一个Filterable
接口。该接口提供了一个getFilter()
方法,您可以在其中挂钩过滤过程。
当您的EditText
中的文本发生变化时,您调用adapter.getFilter().filter("filterString")
。 EditText
的文本更改行为是通过在 EditText
上使用 TextWatcher
来完成的。以下教程详细解释了它:
http://www.survivingwithandroid.com/2012/10/android-listview-custom-filter-and.html
编辑:
要实现可过滤接口,只需在您的ArrayAdapter
中执行此操作:
static class MyAdapter extends ArrayAdapter<String> implements Filterable
private Filter myFilter;
@Override
public Filter getFilter()
if (myFilter == null)
myFilter = new MyFilter();
return myFilter;
其中MyFilter
是您自己的Filter
类。
【讨论】:
请仔细阅读本教程。您是否在 ArrayAdapter 中实现了Filterable
接口?如果是这样,请在编辑中发布代码并通过评论告诉我。
我无法在我的适配器中实现 Filterable 接口。我不知道你把它放在我的代码哪里。
@invisible142 *** 无法解释一切的基础知识,对不起。您绝对应该阅读 Java 接口。你不能只是跳入 Android 开发,否则你会遇到这些 Java 的东西。但是,我将在我的编辑中向您展示如何实现它。
代码似乎可以工作,但是当我写任何字母时,它总是显示相同的三个结果,但在我的列表中大约有十个..真的不知道为什么!以上是关于Android自定义ListView:添加搜索功能的主要内容,如果未能解决你的问题,请参考以下文章
Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能
Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能
为自定义 Listview 添加搜索到自定义 SimpleAdapter