使用过滤器的EditText的ListView [英] Filter ListView using EditText

查看:254
本文介绍了使用过滤器的EditText的ListView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基本上我试图使用过滤一个EditText一个ListView。我设法保存所有的过滤结果,但好像我失去了一些东西,因为用户界面不更新,它不显示任何文本改变。任何迹象?谢谢

 进口android.app.Activity;
进口android.content.Context;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.Filter;
进口android.widget.Filterable;
进口android.widget.ImageView;
进口android.widget.TextView;

进口com.enloop.R;

进口的java.util.ArrayList;

公共类FriendsWithMeAdapter扩展了BaseAdapter实现过滤的{
    私人语境mContext;
    私人的ArrayList< FriendsModel>朋友;
    私人的ArrayList< FriendsModel>项目=新的ArrayList< FriendsModel>();
    私人的ArrayList< FriendsModel>建议=新的ArrayList< FriendsModel>();

    公共FriendsWithMeAdapter(上下文C,ArrayList的< FriendsModel> AI){
        mContext = C;
        朋友=爱;
    }

    @覆盖
    公众诠释getCount将(){
        返回friend.size();
    }

    @覆盖
    公共对象的getItem(INT位置){
        返回friend.get(位置);
    }

    @覆盖
    众长getItemId(INT位置){
        返回0;
    }

    @覆盖
    公共查看getView(INT位置,查看convertView,ViewGroup中父){
        如果(convertView == NULL){
            LayoutInflater mInflater =(LayoutInflater)
                    mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.item_friend,NULL);
        }
        ImageView的userImage =(ImageView的)convertView.findViewById(R.id.invited_friend_picture);
        ImageView的checkImage =(ImageView的)convertView.findViewById(R.id.invite_friends_check);
        TextView的名称=(TextView中)convertView.findViewById(R.id.invited_friend_name);
        TextView中的userName =(TextView中)convertView.findViewById(R.id.invited_friend_name);

        userImage.setImageBitmap(friend.get(位置).getUserImage());
        checkImage.setImageResource(friend.get(位置).isWithMe()?
                R.drawable.btn_checkmark_round_tiny:R.drawable.btn_before_checkmark_round_tiny);

        字符串userEnloopNameString = friend.get(位置).getName();
        name.setText(userNameString);


        字符串userNameString = friend.get(位置).getUserName();
        如果(userNameString.length()> 12){
            userNameString = userNameString.substring(0,10);
            userNameString + =;
        }
        userName.setText(userNameString);

        返回convertView;
    }

    @覆盖
    公共过滤用getFilter(){
        过滤器过滤器=新的过滤器(){

            @覆盖
            保护FilterResults performFiltering(CharSequence的约束){

                FilterResults结果=新FilterResults();

                如果(约束== NULL和放大器;&安培; constraint.length()== 0){
                    results.values​​ =朋友;
                    results.count = friend.size();
                } 其他 {
                    对于(FriendsModel项目:朋友){
                        如果(item.getName()。与toLowerCase()。包含(constraint.toString()。与toLowerCase()))
                            suggestions.add(项目);
                    }
                    results.values​​ =建议;
                    results.count = suggestions.size();
                }

                返回结果;
            }


            @覆盖
            保护无效publishResults(CharSequence的约束,FilterResults结果){

                如果(results.count == 0){
                    notifyDataSetInvalidated();
                } 其他 {
                    项目=(ArrayList的< FriendsModel>)results.values​​;
                }
            }
        };
        返回过滤器;
    }
}




mSearch.addTextChangedListener(新TextWatcher(){
            @覆盖
            公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数,之后INT){

            }

            @覆盖
            公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
                。adapter.getFilter()滤波器(s.toString());
            }

            @覆盖
            公共无效afterTextChanged(编辑S){

            }
        });
 

解决方案

试试这个办法,希望这将帮助你解决你的问题。

  mSearch.addTextChangedListener(新TextWatcher(){
      @覆盖
      公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数,之后INT){

      }

      @覆盖
      公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){

      }

      @覆盖
      公共无效afterTextChanged(编辑S){
           adapter.filter(文本);
      }
});
 

在这里使用两个目录一为原始数据,另一个用于过滤后的数据,请时刻牢记您不能使用(=)分配过滤的数据,如果你这样做的方式,那么你过滤后的数据还改变原来的数据太多,过滤后的数据使用名单显示列表项,所以你必须使用的addAll(),而不是(=)赋值是不会改变原来的数据,只要你使用自定义适配器尝试使​​用的 ViewHolder 模式。

 公共类FriendsWithMeAdapter扩展了BaseAdapter实现过滤的{
    私人语境mContext;
    私人的ArrayList< FriendsModel>朋友;
    私人的ArrayList< FriendsModel>建议=新的ArrayList< FriendsModel>();

    公共FriendsWithMeAdapter(上下文mContext,ArrayList的< FriendsModel>朋友){
        this.mContext = mContext;
        this.friend =朋友;
        建议=新的ArrayList< FriendsModel>();
        suggestions.addAll(朋友);
    }

    @覆盖
    公众诠释getCount将(){
        返回suggestions.size();
    }

    @覆盖
    公共对象的getItem(INT位置){
        返回suggestions.get(位置);
    }

    @覆盖
    众长getItemId(INT位置){
        返回0;
    }

    @覆盖
    公共查看getView(INT位置,查看convertView,ViewGroup中父){
        ViewHolder持有人;
        如果(convertView == NULL){
            持有人=新ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_friend,NULL);
            holder.userImage =(ImageView的)convertView.findViewById(R.id.invited_friend_picture);
            holder.checkImage =(ImageView的)convertView.findViewById(R.id.invite_friends_check);
            holder.name =(TextView中)convertView.findViewById(R.id.invited_friend_name);
            holder.userName =(TextView中)convertView.findViewById(R.id.invited_friend_name);

            convertView.setTag(保持器);

        }其他{
            支架=(ViewHolder)convertView.getTag();
        }


        holder.userImage.setImageBitmap(suggestions.get(位置).getUserImage());
        holder.checkImage.setImageResource(suggestions.get(位置).isWithMe()?
                R.drawable.btn_checkmark_round_tiny:R.drawable.btn_before_checkmark_round_tiny);

        字符串userEnloopNameString = suggestions.get(位置).getName();
        holder.name.setText(userNameString);


        字符串userNameString = suggestions.get(位置).getUserName();
        如果(userNameString.length()> 12){
            userNameString = userNameString.substring(0,10);
            userNameString + =;
        }
        holder.userName.setText(userNameString);

        返回convertView;
    }

    公共无效过滤器(字符串charText){
        suggestions.clear();
        如果(charText.length()== 0){
            suggestions.addAll(朋友);
        }其他{
            对于(FriendsModel项目:朋友){
                如果(item.getName()。与toLowerCase()。包含(constraint.toString()。与toLowerCase()))
                    suggestions.add(项目);
            }
        }
        notifyDataSetChanged();
    }


    公共类ViewHolder {
        ImageView的userImage;
        ImageView的checkImage;
        TextView的名称;
        TextView的用户名;
    }
}
 

Basically I'm trying to filter a ListView using an EditText. I manage to store all the filtered results but seems like I'm missing something since the UI is not updated and it's not displaying anything on text changed. Any indications? Thanks

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import com.enloop.R;

import java.util.ArrayList;

public class FriendsWithMeAdapter extends BaseAdapter implements Filterable {
    private Context mContext;
    private ArrayList<FriendsModel> friend;
    private ArrayList<FriendsModel> items = new ArrayList<FriendsModel>();
    private ArrayList<FriendsModel> suggestions = new ArrayList<FriendsModel>();

    public FriendsWithMeAdapter(Context c, ArrayList<FriendsModel> ai) {
        mContext = c;
        friend = ai;
    }

    @Override
    public int getCount() {
        return friend.size();
    }

    @Override
    public Object getItem(int position) {
        return friend.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.item_friend, null);
        }
        ImageView userImage = (ImageView) convertView.findViewById(R.id.invited_friend_picture);
        ImageView checkImage = (ImageView) convertView.findViewById(R.id.invite_friends_check);
        TextView name = (TextView) convertView.findViewById(R.id.invited_friend_name);
        TextView userName = (TextView) convertView.findViewById(R.id.invited_friend_name);

        userImage.setImageBitmap(friend.get(position).getUserImage());
        checkImage.setImageResource(friend.get(position).isWithMe() ?
                R.drawable.btn_checkmark_round_tiny : R.drawable.btn_before_checkmark_round_tiny);

        String userEnloopNameString = friend.get(position).getName();
        name.setText(userNameString);


        String userNameString = friend.get(position).getUserName();
        if (userNameString.length() > 12) {
            userNameString = userNameString.substring(0, 10);
            userNameString += "..";
        }
        userName.setText(userNameString);

        return convertView;
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();

                if (constraint == null && constraint.length() == 0) {
                    results.values = friend;
                    results.count = friend.size();
                } else {
                    for (FriendsModel item : friend) {
                        if (item.getName().toLowerCase().contains(constraint.toString().toLowerCase()))
                            suggestions.add(item);
                    }
                    results.values = suggestions;
                    results.count = suggestions.size();
                }

                return results;
            }


            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                if (results.count == 0) {
                    notifyDataSetInvalidated();
                } else {
                    items = (ArrayList<FriendsModel>) results.values;
                }
            }
        };
        return filter;
    }
}




mSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                adapter.getFilter().filter(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

解决方案

Try this way,hope this will help you to solve your problem.

mSearch.addTextChangedListener(new TextWatcher() {
      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {

      }

      @Override
      public void onTextChanged(CharSequence s, int start, int before, int count) {

      }

      @Override
      public void afterTextChanged(Editable s) {
           adapter.filter(text);
      }
});

Here use two list one for original data and another one for filtered data please keep mind you can not use (=)assignment for filtered data if you do this way then you filtered data also alter original data too,filtered data use to shown list list item so you have to use addAll() instead (=) assignment which is not altered original data and whenever you use custom adapter try to use ViewHolder pattern.

public class FriendsWithMeAdapter extends BaseAdapter implements Filterable {
    private Context mContext;
    private ArrayList<FriendsModel> friend;
    private ArrayList<FriendsModel> suggestions = new ArrayList<FriendsModel>();

    public FriendsWithMeAdapter(Context mContext, ArrayList<FriendsModel> friend) {
        this.mContext = mContext;
        this.friend = friend;
        suggestions =new ArrayList<FriendsModel>();
        suggestions.addAll(friend);
    }

    @Override
    public int getCount() {
        return suggestions.size();
    }

    @Override
    public Object getItem(int position) {
        return suggestions.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView =  LayoutInflater.from(mContext).inflate(R.layout.item_friend, null);
            holder.userImage = (ImageView) convertView.findViewById(R.id.invited_friend_picture);
            holder.checkImage = (ImageView) convertView.findViewById(R.id.invite_friends_check);
            holder.name = (TextView) convertView.findViewById(R.id.invited_friend_name);
            holder.userName = (TextView) convertView.findViewById(R.id.invited_friend_name);

            convertView.setTag(holder);

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


        holder.userImage.setImageBitmap(suggestions.get(position).getUserImage());
        holder.checkImage.setImageResource(suggestions.get(position).isWithMe() ?
                R.drawable.btn_checkmark_round_tiny : R.drawable.btn_before_checkmark_round_tiny);

        String userEnloopNameString = suggestions.get(position).getName();
        holder.name.setText(userNameString);


        String userNameString = suggestions.get(position).getUserName();
        if (userNameString.length() > 12) {
            userNameString = userNameString.substring(0, 10);
            userNameString += "..";
        }
        holder.userName.setText(userNameString);

        return convertView;
    }

    public void filter(String charText) {
        suggestions.clear();
        if (charText.length() == 0) {
            suggestions.addAll(friend);
        }else{
            for (FriendsModel item : friend) {
                if (item.getName().toLowerCase().contains(constraint.toString().toLowerCase()))
                    suggestions.add(item);
            }
        }
        notifyDataSetChanged();
    }


    public class ViewHolder {
        ImageView userImage;
        ImageView checkImage;
        TextView name;
        TextView userName;
    }
}

这篇关于使用过滤器的EditText的ListView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆