使用Android中的ArrayAdapter搜索自定义列表视图

时间:2013-08-26 04:35:46

标签: listview search filter adapter android-arrayadapter

我有一个自定义列表视图,其中包含两个TextView和一个ImageView。它使用自定义ArrayAdapter作为它的适配器,我想为它添加一个搜索功能。我查看了我能找到的每一个教程,没有运气。但是通过一个教程,我能够通过常规列表视图(不使用自定义适配器)进行搜索,但这对我不起作用,因为我需要同时显示TextView和ImageView。我只需要过滤其中一个TextViews,所以我看不出它有多麻烦。

无论如何,这是MainActivity:

public class ItemId extends Activity {

    // List view
    private ListView lv;

    // Listview Adapter
    ArrayAdapter<String> adapter;

    // Search EditText
    EditText inputSearch;


    // ArrayList for Listview
    ArrayList<HashMap<String, String>> productList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testo);

        Context ctx = getApplication();
        Resources res = ctx.getResources();

        String[] options = res.getStringArray(R.array.item_names);

        lv = (ListView) findViewById(R.id.list_view);
        inputSearch = (EditText) findViewById(R.id.inputSearch);

        // Adding items to listview
        adapter = new ArrayAdapter<String>(this, R.layout.list_item_test, R.id.product_name, options);
        lv.setAdapter(adapter);

        /**
         * Enabling Search Filter
         * */
        inputSearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                // When user changed the Text
                ItemId.this.adapter.getFilter().filter(cs);   
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub                          
            }
        });
    }    
}

这是自定义适配器:

public class ItemIDAdapter extends ArrayAdapter<String> implements Filterable {

    public LayoutInflater mInflater;

    public String[] mStrings;
    public String[] mIds;
    public TypedArray mIcons;   
    public int mViewResourceId;

    public ItemIDAdapter(Context ctx, int viewResourceId,
            String[] strings, String[] ids, TypedArray icons) {
        super(ctx, viewResourceId, strings);

        mInflater = (LayoutInflater)ctx.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);

        mStrings = strings;
        mIds = ids;
        mIcons = icons;       
        mViewResourceId = viewResourceId;
    }

    @Override
    public int getCount() {
        return mStrings.length;
    }

    @Override
    public String getItem(int position) {
        return mStrings[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = mInflater.inflate(mViewResourceId, null);

        ImageView iv = (ImageView)convertView.findViewById(R.id.option_icon);
        iv.setImageDrawable(mIcons.getDrawable(position));

        TextView tv = (TextView)convertView.findViewById(R.id.option_text);
        tv.setText(mStrings[position]);

        TextView tv1 = (TextView)convertView.findViewById(R.id.itemids);
        tv1.setText(mIds[position]);

        return convertView;
    }


}

希望有人可以帮助我,因为这是一个非常乏味的挑战,因为我是Android开发的新手,而且我没有选择。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

在你的oncreate()中

 inputSearch = (EditText)findViewById(R.id.inputSearch);
         inputSearch.addTextChangedListener(new TextWatcher() {

             @Override
             public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                 // When user changed the Text
                 youradaptername.getFilter().filter(cs);   
             }

             @Override
             public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                     int arg3) {
                 // TODO Auto-generated method stub

             }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }
         });

并在你的布局中:

<EditText android:id="@+id/inputSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="Search.."
        android:inputType="textVisiblePassword"/>