【问题标题】:How to filter the listview in android?如何过滤android中的listview?
【发布时间】:2014-01-27 08:48:38
【问题描述】:

为这个问题提供了许多解决方案,但我并没有确切地知道我哪里出错了。我有一个自定义适配器,我想过滤它。

我的适配器类如下。

public sendivitesadapter(Context context,ArrayList<Item> items,String[]udis) {
        super(context,0,items);

        this.context= context;
         mCheckedState = new boolean[items.size()];
        this.qrusers =(qrusers) context;
        this.items = items;
        this.udis=uid;
        //mContext = context;
        vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return items.size();
    }

    @Override
    public Item getItem(int position) {
        // TODO Auto-generated method stub
        return super.getItem(position);
    }

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

            View v = convertView;

            final Item i = items.get(position);

            if (i != null) {
                if(i.isSection()){
                    SectionItem si = (SectionItem)i;
                    v = vi.inflate(R.layout.checkboxlist, null);

                    v.setOnClickListener(null);
                    v.setOnLongClickListener(null);
                    v.setLongClickable(false);

                    final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
                    sectionView.setText(si.getTitle());

                }else{
                    sendItem ei = (sendItem)i;
                    v = vi.inflate(R.layout.checkboxlist, null);
                    final TextView title = (TextView)v.findViewById(R.id.contactname);
                    final TextView subtitle = (TextView)v.findViewById(R.id.companyname);
                     checkBox=(CheckBox)v.findViewById(R.id.checboxlist);
                    //checkBox.setTag(position);
                    //items.addAll(uid);


               checkBox.setTag(udis[position]);





               checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    if(isChecked){

                        //  isChecked=true;
                        s=(String)buttonView.getTag();
                        Log.e("IDDDDDDDD", s);

                        userid.add(s);
                        Log.e("Array", userid.toString());
                    }
                    else{

                        s=(String)buttonView.getTag();
                        userid.remove(s);

                    }

                    SharedPreferences app_preferences = PreferenceManager
                            .getDefaultSharedPreferences(qrusers.this);
                    SharedPreferences.Editor editor = app_preferences.edit();

                    editor.putString("userid", TextUtils.join(",", userid));
                    editor.commit();
                }
            });

                    if (title != null) 
                        title.setText(ei.contactname);
                    if(subtitle != null)
                        subtitle.setText(ei.companyname);

                }
            }
            return v;
        }

         public Filter getFilter() {
                if (mFilter1 == null) {
                    mFilter1 = new ItemsFilter1();
                }
                return mFilter1;

            }

        private class ItemsFilter1 extends Filter{

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();

                if (constraint == null || constraint.length() == 0){
                    results.values = items;
                    results.count = items.size();

                }
                else{

                     ArrayList<Item> itemsList1 = new ArrayList<Item>();

                     for (Item i : items){

                         if (i.toString().toUpperCase().startsWith(constraint.toString().toUpperCase()))
                                itemsList1.add(i);
                     }
                     results.values = itemsList1;
                        results.count = itemsList1.size();
                }
                return results;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                 if (results.count == 0){

                     notifyDataSetInvalidated();
                 }
                 else{

                     ArrayList<Item> lst1 = (ArrayList<Item>)results.values;
                     ArrayList<Item> itemsList1 = new ArrayList<Item>(lst1);
                     //this.items=mItems;
                    items =itemsList1;              
                    notifyDataSetChanged();
                 }

            }



        }

在我的活动中,我使用了这个代码。

 usersearch1.addTextChangedListener(new TextWatcher() {

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        if (usersearch1.getText().toString().equals("")){
                            sendadapter  = new sendivitesadapter(qrusers.this,items1,uid);

                            listView.setAdapter(sendadapter);



                        }

                        s=usersearch1.getText().toString();
                        Log.e("ALPHABETS", usersearch1.getText().toString());
                        sendadapter.getFilter().filter(s);
                    }

没有错误,但是当我输入 EditText 时,没有任何反应。请让我知道我错了。

【问题讨论】:

    标签: android listview android-edittext android-filterable


    【解决方案1】:

    添加 onTextChanged 方法

      if (!usersearch1.getText().toString().equals(""))
      {
        sendadapter.getFilter().filter(s);
    
       //Must
        sendadapter.notifyDataSetChanged();
      }
    

    【讨论】:

      【解决方案2】:

      首先 - 为什么将适配器设置在 TextChangeListener 中?无论您在 EditText 中键入什么内容,它都会刷新您的 listView,而无需对其进行任何更改。

      其次 - 如果你在 sendadapter 中很好地实现了 getFilter() 方法,那么你应该在 onTextChange 中做的唯一事情就是重置适配器的数据(获取适配器数据的默认视图)然后执行sendadapter.getFilter().filter(s)

      所以,在你的onCreate 活动中,你至少应该这样做:

      @Override
      protected void onCreate(Bundle savedInstanceState) 
      {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.YourSearchActivity);
      
          //since you haven't show rest of the code, im guessing names of the variables and U elements
          //connect UI elements with varables in code
          EditText usersearch1 = (EditText) findViewById(R.id.usersearch1);       
          ListView listView = (ListView) findViewById(R.id.listview)
          sendadapter = new sendinvitesadapter(yourActivity.this, YourListOfItems, YourStringofUdis);
      
          /*
          *  REST OF CODE
          */
      
          //set text listener to your EditText 
          usersearch1.addTextChangedListener(new TextWatcher() 
          {
              @Override
              public void onTextChanged(CharSequence s, int start, int before, int count) 
              {
                  // if (count < before) {sendadapter.resetData();}
                  //resetData() method might be necessary, if your filtering method won't react on backspace 
                  Log.e("ALPHABETS", usersearch1.getText().toString());
                  sendadapter.getFilter().filter(s);
              }
          });
      
      
          /*
          *  REST OF CODE
          */
      
          //set adapter
          listView.setAdapter(sendadapter);
          //enable filtering of your list
          listView.setTextFilterEnabled(true);                            
      }
      

      【讨论】:

      • 那么你应该重新考虑你的整个代码。使用自定义适配器时出错并不难...我发布的代码是我自己的代码,它对我有用...抱歉我帮不上忙:(
      • 你能在这里分享你的代码吗..!!这样我就可以通过它。
      猜你喜欢
      • 2013-11-21
      • 1970-01-01
      • 2011-10-17
      • 2012-12-11
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多