安卓定制的ListView:添加搜索功能 [英] Android custom ListView: adding search function
问题描述
我有一个问题,我想我上面的ListView一个EditText执行在ListView中搜索。是否有可能呢?
这是活动code:
公共静态类BirreChiareListView扩展主要实现AdapterView.OnItemClickListener {
ListView控件列表;
的String [] birrechiare;
INT []的图像= {R.drawable.ichnusa,R.drawable.ichnusa_speciale,R.drawable.ichnusa_cruda};
私人MyAdapter适配器;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(birrechiare_listview);
资源RES = getResources();
birrechiare = res.getStringArray(R.array.birre_chiare);
名单=(ListView控件)findViewById(R.id.listViewBirreChiare);
MyAdapter适配器=新MyAdapter(这一点,birrechiare,图像);
list.setAdapter(适配器);
list.setOnItemClickListener(本);
}
@覆盖
公共无效onItemClick(适配器视图<>适配器,视图中查看,INT位置,长L){
字符串项= adapter.getItemAtPosition(位置)的ToString();
Toast.makeText(getApplicationContext(),海selezionato:+条,Toast.LENGTH_SHORT).show();
如果(位置== 0){
意图gotoclassica =新的意图(BirreChiareListView.this,Ichnusa_Classica.class);
startActivity(gotoclassica);
}
如果(位置== 1){
意图gotospeciale =新的意图(BirreChiareListView.this,Ichnusa_Speciale.class);
startActivity(gotospeciale);
}
如果(位置== 2){
意图gotocruda =新的意图(BirreChiareListView.this,Ichnusa_Cruda.class);
startActivity(gotocruda);
}
}
}
静态类MyAdapter扩展ArrayAdapter<字符串> {
上下文语境;
INT []的图像;
的String [] titleArray;
MyAdapter(上下文C,的String []冠军,诠释IMGS []){
超级(C,SINGLE_ROW,R.id.Titletxt,职称);
this.context = C;
this.images = IMGS;
this.titleArray =冠军;
}
@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
LayoutInflater充气=(LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);
查看排= inflater.inflate(SINGLE_ROW,父母,假);
ImageView的MYIMAGE =(ImageView的)row.findViewById(R.id.imageView);
TextView的mytitle =(TextView中)row.findViewById(R.id.Titletxt);
myimage.setImageResource(图片[位置]);
mytitle.setText(titleArray [位置]);
返回行;
}
}
好吧,这是在ListView的XML文件:
< XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT
机器人:方向=垂直
机器人:背景=@可绘制/ background_listview>
<的TextView
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
机器人:文本=Birre Chiare
机器人:单线=假
机器人:文字颜色=#FFFFFF
机器人:重力=中心/>
<的EditText
机器人:ID =@ + ID /搜索
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT>
<不是requestFocus />
< /的EditText>
<的ListView
机器人:ID =@ + ID / listViewBirreChiare
机器人:layout_width =match_parent
机器人:layout_height =WRAP_CONTENT>
< / ListView控件>
< / LinearLayout中>
最后,这是single_row.xml文件:
< XML版本=1.0编码=UTF-8&GT?;
< RelativeLayout的的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent机器人:layout_height =match_parent>
< ImageView的
机器人:layout_width =100dp
机器人:layout_height =100dp
机器人:ID =@ + ID / ImageView的
机器人:layout_alignParentTop =真
机器人:layout_alignParentLeft =真
机器人:layout_alignParentStart =真
机器人:SRC =@可绘制/ ichnusa/>
<的TextView
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:textAppearance =机器人:ATTR / textAppearanceLarge
机器人:文本=大文本
机器人:ID =@ + ID / Titletxt
机器人:layout_alignBottom =@ + ID / ImageView的
机器人:layout_toRightOf =@ + ID / ImageView的
机器人:layout_marginBottom =35dp
机器人:layout_alignParentRight =真
机器人:layout_alignParentEnd =真/>
< / RelativeLayout的>
是的,这是绝对有可能的事情。 Android提供了 ArrayAdapter
s的可筛选
接口。该接口提供了一个用getFilter()
方法,在这里你可以连接到过滤过程。
在文本改变你的的EditText
,你叫 adapter.getFilter()。过滤器(filterString)
。对于文本改变行为的EditText
通过使用 TextWatcher
在的EditText 完成code>。这下面的教程,介绍了其良好的细节:
的http://www.survivingwithandroid.com/2012/10/android-listview-custom-filter-and.html
编辑:
要实现过滤的界面,只是这样做在你的 ArrayAdapter
:
静态类MyAdapter扩展ArrayAdapter<字符串>实现过滤的{
私人过滤myFilter;
@覆盖
公共过滤用getFilter(){
如果(myFilter == NULL)
myFilter =新MyFilter();
返回myFilter;
}
}
其中, MyFilter
是你自己的过滤器
类。
i've a problem, i want an EditText above my ListView that performs a search in that ListView. Is it possible to do?
This is the Activity code:
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;
}
}
Ok, this is the XML file of the ListView:
<?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"
android:background="@drawable/background_listview">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Birre Chiare"
android:singleLine="false"
android:textColor="#FFFFFF"
android:gravity="center"/>
<EditText
android:id="@+id/search"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<requestFocus />
</EditText>
<ListView
android:id="@+id/listViewBirreChiare"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
At the end, this is the single_row.xml file:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/imageView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:src="@drawable/ichnusa"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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>
Yes this is definitely possible to do. Android provides a Filterable
interface for ArrayAdapter
s. The interface provides a getFilter()
method where you can hook into the filtering process.
When the text changes in your EditText
, you call adapter.getFilter().filter("filterString")
. The text changing behaviour for the EditText
is done by using a TextWatcher
on the EditText
. This following tutorial, explains it in good detail:
http://www.survivingwithandroid.com/2012/10/android-listview-custom-filter-and.html
EDIT:
To implement the filterable interface, just do this in your ArrayAdapter
:
static class MyAdapter extends ArrayAdapter<String> implements Filterable {
private Filter myFilter;
@Override
public Filter getFilter() {
if (myFilter == null)
myFilter = new MyFilter();
return myFilter;
}
}
where MyFilter
is your own Filter
class.
这篇关于安卓定制的ListView:添加搜索功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!