Android Searchview for listview->如何修改适配器

Android Searchview for listview->如何修改适配器,android,listview,adapter,searchview,Android,Listview,Adapter,Searchview,我真的需要一些关于SearchView和我的带有自定义列表项的listview的帮助。我认为我的活动类的编码是正确的,但我真的不知道在适配器中该做什么 如果需要的话,我会把活动类的代码放进去。。 这是我目前的适配器: public class List_message extends BaseAdapter implements Filterable { private Context context; private List<String> sender;

我真的需要一些关于SearchView和我的带有自定义列表项的listview的帮助。我认为我的活动类的编码是正确的,但我真的不知道在适配器中该做什么

如果需要的话,我会把活动类的代码放进去。。 这是我目前的适配器:

public class List_message extends BaseAdapter implements Filterable {

    private Context context;
    private List<String> sender;
    private List<String> type;

    private LayoutInflater inflater;


    public List_message(Context context,List<String> sender,List<String> type ) { 

        inflater = LayoutInflater.from( context );
        this.context = context;
        this.sender = sender;
        this.type = type;

    }

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

    public Object getItem(int position) {     
        return sender.get(position);
    }

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

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

        String sender_tekst = sender.get(position);
        String type_tekst = type.get(position);

        View v = null;
        if( convertView != null )
            v = convertView;
        else
            v = inflater.inflate( R.layout.vrstica_private_message, parent, false);

        TextView posiljatelj = (TextView)v.findViewById( R.id.message_sender);
        posiljatelj.setText( sender_tekst );

        TextView type = (TextView)v.findViewById( R.id.message_writer);
        type.setText( type_tekst );

        ImageButton button = (ImageButton)v.findViewById( R.id.message_delete);
            button.setOnClickListener(
                        new OnClickListener() {
                            public void onClick(View v) {                                       
                            }
                        });
        return v;
    }
    public Filter getFilter() {
        return null;
    }
}

我不喜欢filterd适配器,但如果您想使用它,请尝试以下链接:

就个人而言,我更喜欢由适配器管理的重新设置列表。在适配器中,添加setter方法:

public void setSender(List<String> sender) {
  this.sender = sender;
}
然后在活动中,您可以执行以下操作:

List<String> allSenders = getSenders();
List<String> filtredSenders = filterSender(allSenders);
YourBaseAdapter yourAdapter = (YourBaseAdapter) mListView.getAdapter();
yourAdapter.setSender(filtredSenders);
yourAdapter.notifyDataSetChanged();

这样,您的适配器将只刷新过滤的项。

您必须创建一个Filter实例,并从适配器中的getFilter方法返回它

public class List_message extends BaseAdapter implements Filterable {

private Context context;
private List<String> sender;
private List<String> allSender;
private List<String> type;

private LayoutInflater inflater;
private Filter filter;


public List_message(Context context,List<String> senders,List<String> type ) { 

    inflater = LayoutInflater.from( context );
    this.context = context;
    this.sender = senders;
    this.allSender = new ArrayList<String>(sender);
    this.type = type;
    filter = new Filter() {

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

            sender = (ArrayList<String>) results.values;
            notifyDataSetChanged();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {


            FilterResults results = new FilterResults();


            if (constraint == null) {
                results.count = allSender.size();
                results.values = allSender;
                return results;
            }

            List<String> filteredList = new ArrayList<String>();

            List<String> startsWithList = new ArrayList<String>();
            List<String> containsList = new ArrayList<String>();

            // perform your search here using the searchConstraint String.


            constraint = constraint.toString().toLowerCase();
            for (int i = 0; i < allSender.size(); i++) {
                String senderString = allSender.get(i);



                if (senderString.toLowerCase().startsWith(constraint.toString())) {
                    startsWithList.add(senderString);
                } else if (senderString.toLowerCase().contains(constraint.toString())) {
                    containsList.add(senderString);
                }

            }


            filteredList.addAll(startsWithList);
            filteredList.addAll(containsList);

            results.count = filteredList.size();
            results.values = filteredList;

            return results;
        }
    };

}

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

public Object getItem(int position) {     
    return sender.get(position);
}

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

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

    String sender_tekst = sender.get(position);
    String type_tekst = type.get(position);

    View v = null;
    if( convertView != null )
        v = convertView;
    else
        v = inflater.inflate( R.layout.vrstica_private_message, parent, false);

    TextView posiljatelj = (TextView)v.findViewById( R.id.message_sender);
    posiljatelj.setText( sender_tekst );

    TextView type = (TextView)v.findViewById( R.id.message_writer);
    type.setText( type_tekst );

    ImageButton button = (ImageButton)v.findViewById( R.id.message_delete);
        button.setOnClickListener(
                    new OnClickListener() {
                        public void onClick(View v) {                                       
                        }
                    });
    return v;
}
public Filter getFilter() {
    return filter;
}
}

只需重新设置列表发送者的过滤列表,并在适配器上执行notifyDataSetChanged。这样,无需更改适配器。别忘了备份完整的发件人列表和已筛选的发件人列表确定,如何重新设置已筛选的列表发件人列表?我应该只备份发件人列表,而不备份筛选后的发件人列表,因为在使用搜索视图时,筛选后的发件人将随时更改,对吗?我最终在这里找到了答案:我只收到了此代码的错误。我不知道我的导入是否有问题,或者是什么。。我尝试了逐行复制,最后也出现了错误..:/如果您觉得错误是由于导入造成的,请尝试自动导入。我还假设你已经在你的编辑文本上实现了一个TextWatcher。