android - GridView 中 ArrayAdapter 的自定义过滤器

标签 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);
}

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

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

private void doMySearch(String query){

}

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

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

最佳答案

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

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);
}

关于android - GridView 中 ArrayAdapter 的自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40436936/

相关文章:

C# GridView : Setting Up AutoGenerateEditButton

asp.net - GridView 和 RowStyle 的问题

c# - gridview findcontrol 返回空 ""

java - 检查当前使用哪个 ArrayAdapter Spinner

java - 我在哪里可以找到创建自定义 ArrayAdapter 的好教程?

android - SearchVIew:空建议列表

java - 在 Java/Android 中,我是通过 Intent 还是使用 getter/setter 传递值?

java - 它说必须调用looper.prepare

java - java剩余天数计算

android - 应用程序因适配器而崩溃