安卓定制的ListView:添加搜索功能 [英] Android custom ListView: adding search function

查看:137
本文介绍了安卓定制的ListView:添加搜索功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题,我想我上面的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:机器人=htt​​p://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:机器人=htt​​p://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 。这下面的教程,介绍了其良好的细节:

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 ArrayAdapters. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆