1

Я хочу, чтобы фильтр GridView, но проблема, кажется, в некотором роде, я организую свои данные внутри View.Пользовательский фильтр для ArrayAdapter в GridView

это код я использую для разметки

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?

+0

использование [это] (https://gist.github.com/pskink/2dd4d17a93caf02ff696533e82f952b0) общий адаптер – pskink

+0

вы можете показать мне случай использования – CBeTJlu4ok

+0

попробовать класс 'MyAdapter расширяет MatchableArrayAdapter {...' и переопределение его методы 'onBind' и' matches' – pskink

ответ

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); 
} 
Смежные вопросы