【问题标题】:Android Searchview for listview -> how to modify adapterAndroid Searchview for listview -> 如何修改适配器
【发布时间】:2014-12-05 13:57:39
【问题描述】:

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

如果需要,我会放上 Activity 类的代码.. 这是我现在的适配器:

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;
    }
}

【问题讨论】:

  • 只需重新设置 List&lt;String&gt; sender 的过滤列表并在您的适配器上执行 notifyDataSetChanged。这样,无需更改适配器。不要忘记备份发件人的完整列表和过滤的发件人列表
  • 好的,如何重新设置 List 发件人的过滤列表?我应该只备份发件人列表而不是过滤的列表,因为过滤的列表会在搜索视图使用时发生变化,对吗?
  • 我终于在这里找到了答案:stackoverflow.com/questions/23422072/…

标签: android listview adapter searchview


【解决方案1】:

我不喜欢过滤适配器,但如果你想使用它,试试这个链接:List Filter Custom Adapter dont give result

就个人而言,我更喜欢由适配器管理的重置列表。在您的适配器中,添加一个 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();

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

【讨论】:

    【解决方案2】:

    您必须创建一个 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;
    }
    }
    

    【讨论】:

    • 我只收到此代码的错误..我不知道我的导入是否有问题或什么..我尝试逐行复制并在最后出现错误..: /
    • 如果您认为错误是由于导入导致的,请尝试自动导入。我还假设你已经在你的编辑文本上实现了一个 TextWatcher。
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多