Android自定义列表视图:添加搜索功能

Android自定义列表视图:添加搜索功能,android,listview,search,android-edittext,Android,Listview,Search,Android Edittext,我有一个问题,我希望在我的ListView上面有一个EditText,在该ListView中执行搜索。有可能吗 这是活动代码: public static class BirreChiareListView extends Main implements AdapterView.OnItemClickListener { ListView list; String [] birrechiare; int [] images={R.drawable.ichnusa, R.

我有一个问题,我希望在我的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;

    }
}
公共静态类BirreChiareListView扩展了主实现AdapterView.OnItemClickListener{
列表视图列表;
字符串[]birrechiare;
int[]images={R.drawable.ichnusa,R.drawable.ichnusa_speciale,R.drawable.ichnusa_cruda};
专用MyAdapter适配器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(birrechiare_listview);
Resources res=getResources();
birrechiare=res.getStringArray(R.array.birre_-chiare);
列表=(ListView)findViewById(R.id.listViewBirreChiare);
MyAdapter=新的MyAdapter(此、birrechiare、图像);
list.setAdapter(适配器);
list.setOnItemClickListener(此);
}
@凌驾
public void onItemClick(适配器视图适配器、视图视图、内部位置、长l){
String item=adapter.getItemAtPosition(位置).toString();
Toast.makeText(getApplicationContext(),“Hai selezionato:“+item,Toast.LENGTH_SHORT).show();
如果(位置==0){
Intent gotoclassica=新Intent(BirreChiareListView.this,Ichnusa_Classica.class);
星触觉(gotoclassica);
}
如果(位置==1){
Intent gotospeciale=新的Intent(BirreChiareListView.this,Ichnusa_Speciale.class);
星触觉(GotosSpecial);
}
如果(位置==2){
Intent gotocruda=新Intent(BirreChiareListView.this,Ichnusa_Cruda.class);
星触觉(gotocruda);
}
}
}
静态类MyAdapter扩展了ArrayAdapter{
语境;
int[]图像;
字符串[]titleArray;
MyAdapter(上下文c,字符串[]标题,int-imgs[]){
超级(c,单行,R.id.Titletxt,标题);
this.context=c;
这个.images=imgs;
this.titleArray=标题;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)上下文.getSystemService(LAYOUT\u充气器\u服务);
视图行=充气机。充气(单行,父项,false);
ImageView myimage=(ImageView)row.findViewById(R.id.ImageView);
TextView mytitle=(TextView)row.findViewById(R.id.Titletxt);
setImageResource(图像[位置]);
mytitle.setText(titleArray[位置]);
返回行;
}
}
好的,这是ListView的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"
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>

最后,这是单_row.xml文件:

<?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>

是的,这绝对是可能的。Android为
ArrayAdapter
s提供了一个
Filterable
接口。该接口提供了一个
getFilter()
方法,您可以在其中钩住过滤过程

EditText
中的文本发生更改时,可以调用
adapter.getFilter().filter(“filterString”)
EditText
的文本更改行为通过使用
EditText
上的
TextWatcher
完成。本教程详细介绍了以下内容:

编辑:

要实现可过滤接口,只需在
ArrayAdapter
中执行此操作:

static class MyAdapter extends ArrayAdapter<String> implements Filterable {
    private Filter myFilter;

    @Override
    public Filter getFilter() {
        if (myFilter == null)
            myFilter = new MyFilter();

        return myFilter;
    }
}
静态类MyAdapter扩展ArrayAdapter实现可过滤{
私有过滤器myFilter;
@凌驾
公共过滤器getFilter(){
如果(myFilter==null)
myFilter=新的myFilter();
返回myFilter;
}
}

其中
MyFilter
是您自己的
Filter
课程。

请仔细阅读本教程。您是否在ArrayAdapter中实现了
Filterable
接口?如果是这样,请在编辑中发布代码,并用注释告知我。我无法在适配器中实现可过滤接口。我不知道你把它放在我的代码里的什么地方。@invisible142 StackOverflow不能解释所有的基本内容,对不起。您肯定应该仔细阅读Java接口。你不能只是跳进Android开发,否则你会遇到这些Java的东西。不过,我将在我的编辑中向您展示如何实现它。代码似乎有效,但当我写任何一封信时,它总是显示相同的三个结果,但在我的列表中大约有十个。真不知道为什么!