【问题标题】:Searching a custom listview using an ArrayAdapter in Android在 Android 中使用 ArrayAdapter 搜索自定义列表视图
【发布时间】:2013-08-26 04:35:46
【问题描述】:

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

不管怎样,这里是 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 开发的新手,而且我别无选择。感谢您的帮助!

【问题讨论】:

    标签: listview search filter adapter android-arrayadapter


    【解决方案1】:

    在你的 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"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      相关资源
      最近更新 更多