【问题标题】:implement getFilter in customAdapter that extends BaseAdapter在扩展 BaseAdapter 的 customAdapter 中实现 getFilter
【发布时间】:2014-01-16 14:12:10
【问题描述】:

前提:我是 Java 和 Android 的新手,为此我搜索了很多,但我不明白如何在我的代码中实现 getFilter。

这是 MainActivity(相关代码):

public void loadList() {

  /* allProd and allSpec are ArrayList<String> */
  String[] allProdString = allProd.toArray(new String[allProd.size()]);
  String[] allSpecString = allSpec.toArray(new String[allSpec.size()]);

  listViewAdapter = new ListViewAdapter(this, allProdString, allSpecString);

  listView.setAdapter(listViewAdapter);

}

这是自定义适配器:

public class ListViewAdapter extends BaseAdapter {

Activity context;
String title[];
String description[];

public ListViewAdapter(Activity context, String[] title, String[] description) {

    super();
    this.context = context;
    this.title = title;
    this.description = description;
}

public int getCount() {
    return title.length;
}

public Object getItem(int position) {
    return position;
}

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

private class ViewHolder {

    TextView txtViewTitle;
    TextView txtViewDescription;

}

public View getView(int position, View convertView, ViewGroup parent) {

    Typeface typeface = Typeface.createFromAsset(context.getAssets(), "font/Simple_Print.ttf");

    ViewHolder holder;
    LayoutInflater inflater =  context.getLayoutInflater();

    if (convertView == null) {

        convertView = inflater.inflate(R.layout.tabella_prodotti, null);
        holder = new ViewHolder();
        holder.txtViewTitle = (TextView) convertView.findViewById(R.id.titoloProd);
        holder.txtViewDescription = (TextView) convertView.findViewById(R.id.subtitoloProd);

        holder.txtViewDescription.setTypeface(typeface);
        holder.txtViewTitle.setTypeface(typeface);

        convertView.setTag(holder);
    }
    else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.txtViewTitle.setText(title [position]);
    holder.txtViewDescription.setText(description [position]);

    return convertView;

 }

}

我怎样才能实现这个函数,以便能够在数组中搜索,并在列表视图中显示过滤结果?

如果您需要任何其他信息,请询问!谢谢

【问题讨论】:

  • 实现Filterable接口。覆盖 getFilter 并过滤数据
  • @Raghunandan 好的.. 你能给我举个例子吗?
  • 有两组数据在搜索时显示过滤后的数据,在没有搜索时显示原始数据。你可以参考这个stackoverflow.com/questions/13090046/…
  • @Raghunandan 所以我应该创建其他 ArrayList 并用过滤后的数据填充它。但是这个新的 ArrayList 我应该在哪里创建?在 MainActivity 中还是在 CustomAdapter 中?因为现在在 MainActivity 中用解析 xml 填充原始 ArrayList
  • 这只是一个想法,您可以决定如何实现自定义过滤器

标签: java android adapter custom-adapter


【解决方案1】:

我认为您的适配器应该是这样的。另外我不建议在 getView() 中实例化对象,即字体对象

 public class ListViewAdapter extends BaseAdapter {
    String title[];
    String description[];
    ArrayList<String> filteredTitleList;
    ArrayList<String> filteredDescripionList;
    Typeface typeface;
    LayoutInflater inflater;

    public ListViewAdapter(Activity context, String[] title, String[] description) {
        super();
        this.context = context;
        this.title = title;
        this.description = description;

        typeface = Typeface.createFromAsset(context.getAssets(),"font/Simple_Print.ttf");

        inflater = context.getLayoutInflater();

        this.filteredTitleList = new ArrayList<String>();
        this.filteredDescripionList = new ArrayList<String>();
        applyFilter(null);
    }

    public void applyFilter(String filter){
        filteredTitleList.clear();
        filteredDescripionList.clear();

        for(int i=0; i < this.title.length; i++){
            String tempTitle = title[i];
            String tempDesc = description[i];

            if(filter == null || filter.equals("")){
                this.filteredTitleList.add(tempTitle);
                this.filteredDescripionList.add(tempDesc);
            }
            else if(tempTitle.toLowerCase().contains(filter.toLowerCase()) || tempDesc.toLowerCase().contains(filter.toLowerCase())){
                this.filteredTitleList.add(tempTitle);
                this.filteredDescripionList.add(tempDesc);
            }

        }
        this.notifyDataSetChanged();
    }

    public int getCount() {
        return filteredTitleList.size();
    }

    public Object getItem(int position) {
        return null;
    }

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

    private class ViewHolder {

        TextView txtViewTitle;
        TextView txtViewDescription;

    }

    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        if (convertView == null) {

            convertView = inflater.inflate(R.layout.tabella_prodotti, null);
            holder = new ViewHolder();
            holder.txtViewTitle = (TextView) convertView.findViewById(R.id.titoloProd);
            holder.txtViewDescription = (TextView) convertView.findViewById(R.id.subtitoloProd);

            holder.txtViewDescription.setTypeface(typeface);
            holder.txtViewTitle.setTypeface(typeface);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.txtViewTitle.setText(this.filteredTitleList.get(position));
        holder.txtViewDescription.setText(this.filteredDescriptionList.get(position));

        return convertView;

     }

    }

【讨论】:

    【解决方案2】:

    找到了解决办法,分享给大家,我在MainActivity的inputSearch中添加了addTextChangedListener:

    inputSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
    
                textLength = inputSearch.getText().length();
                //allProd_sort and allSpec_sort are ArrayList for search
                allProd_sort.clear();
                allSpec_sort.clear();
                String text = inputSearch.getText().toString();
    
                //allProdString is the String get from ArrayList allProd
                for (int y =0; y<allProdString.length; y++) {
    
                      //in my case the search works only if there are min 3 characters in search
                     if (textLength <= allProdString[y].length() && textLength >=3) {
    
                          if (Pattern.compile(Pattern.quote(text), Pattern.CASE_INSENSITIVE)
                                    .matcher(allProdString[y]).find()) {
    
                              allProd_sort.add(allProdString[y]);
                              allSpec_sort.add(allSpecString[y]);
                          }
                      }
                   }
    
                   String[] allProdStringSort = allProd_sort.toArray(new String[allProd_sort.size()]);
                   String[] allSpecStringSort = allSpec_sort.toArray(new String[allSpec_sort.size()]);
    
                   listView.setAdapter(new ListViewAdapter(MainActivity.this, allProdStringSort, allSpecStringSort));
                }
    
            @Override
            public void afterTextChanged(Editable editable) {
    
          }
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多