GridView中ArrayAdapter的自定义过滤器

时间:2016-11-05 10:05:48

标签: android gridview android-arrayadapter android-adapter baseadapter

我想过滤GridView,但问题似乎是我在View内组织数据的方式。

这是我用于布局的代码

private GridView list;

private void loadListView(){
    list = (GridView)findViewById(R.id.apps_list);

    ArrayAdapter<AppDetail> adapter = new ArrayAdapter<AppDetail>(this, R.layout.list_item, apps) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView == null){
                convertView = getLayoutInflater().inflate(R.layout.list_item, null);
            }

            ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon);
            appIcon.setImageDrawable(apps.get(position).icon);
            appIcon.setTag(apps.get(position).name);
            TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_label);
            appLabel.setText(apps.get(position).label);
            //TextView appName = (TextView)convertView.findViewById(R.id.item_app_name);
            //appName.setText(apps.get(position).name);

            return convertView;
        }
    };

    list.setAdapter(adapter);
}

正如您可能已经理解的那样,我正在过滤设备上安装的应用列表。

现在我在同一个活动中定义了一个搜索方法。

private void doMySearch(String query){

}

这里我需要使用查询过滤适配器。当我尝试重新初始化arrayAdapter并使用adapter.getFilter().filter(query);对其进行过滤时 它不起作用。

根据apps.label属性过滤适配器的方法是什么?

1 个答案:

答案 0 :(得分:1)

这就是我解决问题的方法。 由于我的过滤器非常基本,我做了自己的循环和过滤,然后将所有这些传递给适配器。

private void doMySearch(final String query){
    list = (GridView)findViewById(R.id.apps_list);


    final List<AppDetail> apps_filtered = new ArrayList<>();

    for(int q = 0; q < apps.size(); q++){
        if(apps.get(q).label.toString().toLowerCase().startsWith(query)) {
            Log.e("ddd", apps.get(q).label.toString().toLowerCase());

            AppDetail app = new AppDetail();
            app.label = apps.get(q).label;
            app.name = apps.get(q).name;
            app.icon = apps.get(q).icon;
            apps_filtered.add(app);
        }
    }

    ArrayAdapter<AppDetail> adapter = new ArrayAdapter<AppDetail>(this, R.layout.list_item, apps_filtered) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView == null){
                convertView = getLayoutInflater().inflate(R.layout.list_item, null);
            }

            ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon);
            appIcon.setImageDrawable(apps_filtered.get(position).icon);
            appIcon.setTag(apps_filtered.get(position).name);
            TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_label);
            appLabel.setText(apps_filtered.get(position).label);
            //TextView appName = (TextView)convertView.findViewById(R.id.item_app_name);
            //appName.setText(apps_filtered.get(position).name);

            return convertView;
        }
    };

    list.setAdapter(adapter);
}