当前位置: 首页 > 知识库问答 >
问题:

android中自定义ArrayAdapter中的自定义getFilter

邹学民
2023-03-14

在自定义arrayAdapter中实现自定义getFilter时遇到问题。实际上,我不知道如何实现它。尝试了各种代码,但仍然没有成功。这是我的自定义阵列适配器。

package com.test.FilterableList.Adapters;

import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.test.FilterableList.Models.ListTO;
import com.test.FilterableList.R;

import android.widget.Filterable;


public class FilterableAdapter extends ArrayAdapter<ListTO> implements Filterable {

    // declaring our ArrayList of items
    public ArrayList<ListTO> objects;

    /* here we must override the constructor for ArrayAdapter
    * the only variable we care about now is ArrayList<Item> objects,
    * because it is the list of objects we want to display.
    */
    public FilterableAdapter(Context context, int textViewResourceId, ArrayList<ListTO> objects) {
        super(context, textViewResourceId, objects);
        this.objects = objects;
    }

    /*
     * we are overriding the getView method here - this is what defines how each
     * list item will look.
     */
    public View getView(int position, View convertView, ViewGroup parent){

        // assign the view we are converting to a local variable
        View v = convertView;

        // first check to see if the view is null. if so, we have to inflate it.
        // to inflate it basically means to render, or show, the view.
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.list_item, null);
        }

        /*
         * Recall that the variable position is sent in as an argument to this method.
         * The variable simply refers to the position of the current object in the list. (The ArrayAdapter
         * iterates through the list we sent it)
         *
         * Therefore, i refers to the current Item object.
         */
        ListTO i = objects.get(position);

        if (i != null) {

            // This is how you obtain a reference to the TextViews.
            // These TextViews are created in the XML files we defined.

            TextView tt = (TextView) v.findViewById(R.id.list_name);
            if (tt != null){
                tt.setText(i.FileName);
            }



        }

        // the view must be returned to our activity
        return v;

    }
}

这是ListTO课程。

package com.test.FilterableList.Models;

public class ListTO {

    public int Id;
    public String FileName;
    public String FileUri;

    public ListTO(int id, String fileName, String fileUri) {

        Id = id;
        FileName = fileName;
        FileUri = fileUri;

    }

}

这是布局图。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/blacklikenbackground"
    tools:context=".AllListActivity" >

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Search"
        android:id="@+id/inputSearch"
        />


    <ListView
        android:id="@+id/test_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>

</LinearLayout>

这里的搜索关键字来自“inputSearch”编辑文本。

这是文本更改的侦听器。

 inputSearch.addTextChangedListener(new TextWatcher() {

                    @Override
                    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                        // When user changed the Text
                      //  Toast.makeText(getActivity(), cs.toString(), Toast.LENGTH_LONG).show();
                        m_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
                    }
                });

谢谢

共有3个答案

须新
2023-03-14

您需要重写适配器中的getFilter()方法并提供自己的过滤器。在这个可过滤示例中查看一个实际的实现。

将以下getFilter()代码添加到您的FilterableAdapter类中,并用您的筛选填充它:

/* (non-Javadoc)
 * @see android.widget.ArrayAdapter#getFilter()
 */
@Override
public Filter getFilter() {
    return new Filter() {

        /* (non-Javadoc)
         * @see android.widget.Filter#performFiltering(java.lang.CharSequence)
         */
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            // TODO Auto-generated method stub
            /*
             * Here, you take the constraint and let it run against the array
             * You return the result in the object of FilterResults in a form
             * you can read later in publichResults.
             */
            return null;
        }

        /* (non-Javadoc)
         * @see android.widget.Filter#publishResults(java.lang.CharSequence, android.widget.Filter.FilterResults)
         */
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            // TODO Auto-generated method stub
            /*
             * Here, you take the result, put it into Adapters array
             * and inform about the the change in data.
             */
        }

    };
}

我在评论中添加了提示。

慎望
2023-03-14

无需写入阵列适配器。编写一个toString()方法,该方法应返回filename的值。

就像

public class ListTO {

    public int Id;
    public String FileName;
    public String FileUri;

    public ListTO(int id, String fileName, String fileUri) {

        Id = id;
        FileName = fileName;
        FileUri = fileUri;

    }

    public String toString(){
        return FileName
    }

}
施敏达
2023-03-14

您遇到了问题,主要是因为您使用的是自定义对象。如果您将字符串或int值传递给数组适配器,它知道如何对其进行过滤。但如果您通过自定义对象默认过滤器实现,您将不知道如何处理该问题。

虽然不清楚您在过滤器中要做什么,但我建议您执行以下步骤。

  1. 正确实施ListTO,尽管这与您目前的目标无关
  2. 实施自定义过滤器
  3. 归还你的过滤器

实现自定义过滤器

您必须做的第一件事是,从您的阵列适配器实现可过滤

其次,提供过滤器的实现

Filter myFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
         FilterResults filterResults = new FilterResults();   
         ArrayList<ListTO> tempList=new ArrayList<ListTO>();
         //constraint is the result from text you want to filter against. 
         //objects is your data set you will filter from
         if(constraint != null && objects!=null) {
             int length=objects.size();
             int i=0;
                while(i<length){
                    ListTO item=objects.get(i);
                    //do whatever you wanna do here
                    //adding result set output array     

                    tempList.add(item);

                    i++;
                }
                //following two lines is very important
                //as publish result can only take FilterResults objects
                filterResults.values = tempList;
                filterResults.count = tempList.size();
          }
          return filterResults;
      }

      @SuppressWarnings("unchecked")
      @Override
      protected void publishResults(CharSequence contraint, FilterResults results) {
          objects = (ArrayList<ListTO>) results.values;
          if (results.count > 0) {
           notifyDataSetChanged();
          } else {
              notifyDataSetInvalidated();
          }  
      }
     };

最后一步,

@Override
     public Filter getFilter() {
        return myFilter;
    }

 类似资料:
  • 不管怎样,关于我的问题:有人愿意编写一个非常、非常、非常、通用、直接和简单的自定义ArrayAdapter,该ArrayAdapter需要两个字符串值,可以与ListView一起使用吗?…或者,尝试调试我的尝试,希望找到我的问题所在。 任何帮助都很感激,谢谢。 我已经包括了我知道需要的代码,但我一直在与其他所有东西罢工。 错误:(20,9)错误:没有为ArrayAdapter找到合适的构造函数(上

  • 这是我设置适配器的方式: 我正在寻找一个解决方案,从昨天开始,我已经阅读了所有关于StackOverflow的帖子,但没有一个与我的问题相匹配。所以我想知道,它是否可以来自LinkedHashMap<...> 编辑:这是我的布局r.layout.etat_piece_item

  • java代码: 类文章 类自定义适配器: 错误logcat:

  • 这是customListAdapter的代码(在第一个链接之后) 在我的主要活动中,我这样调用自定义基适配器: (不能100%确定是我应该放在那里的id。

  • 问题内容: 我浏览了教程并进行了搜索,但仍然不明白该怎么做, 当扩展在我的android应用程序中创建自定义listView 时,此方法有效。因此,我无法完全按照需要编辑“自定义”列表视图。 我需要知道何时调用此方法以及参数的含义。 如果有人可以解释以下方法很好。谢谢 问题答案: getView() :如规范中所述,getView方法将数据显示在指定位置。因此,当您设置适配器并滚动时,将调用lis

  • 问题内容: 我想在锻炼应用程序中实现自定义RatingBar。条形图应具有4星,并且步长为1。布局如下所示: 我想用自定义图像替换默认的星星。但是,四颗星中的每一个都应该具有不同的图像: 星号1 =“ X”,表示“此项目已禁用” 星号2 =拇指朝下 星号3 =代表“中立等级”的事物 星号4 =大拇指 另外,例如,当该商品的等级为3(中性等级)时,所有其他星星(1,2和4)应显示其图像的灰色版本。