2014-12-05 50 views
0

我真的需要一些SearchView和我的列表视图与自定义列表项的帮助。我认为我的活动班编码好,但我真的不知道该怎么办在我的适配器..Android Searchview for 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; 
    } 
} 
+0

只需重新设置'列表 sender'的过滤列表并在适配器上执行notifyDataSetChanged。这样,不需要更改适配器。不要忘记备份发件人的完整列表和过滤器列表 – Jivy 2014-12-05 14:11:14

+0

好的,我如何重新设置列表发件人的过滤列表? 我应该仅备份发件人的列表,而不是过滤的列表,因为随时搜索视图正在使用的过滤器会被更改吗? – DJack 2014-12-05 14:19:30

+0

我结束我在这里找到了答案: http://stackoverflow.com/questions/23422072/searchview-in-listview-having-a-custom-adapter – DJack 2014-12-08 19:55:47

回答

0

我不喜欢filterd适配器,但如果你想使用它,请访问这个链接: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(); 

有了这个,你的适配器将只filtred项目刷新。

0

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

我只得到这个代码中的错误..我不知道是否我的进口或什么是错的.. 我试着复制一行一行,也在最后的错误..:/ – DJack 2014-12-07 11:52:39

+0

如果你觉得错误是由于进口,然后尝试自动导入。我还假设你已经在你的编辑文本上实现了一个TextWatcher。 – 2014-12-07 16:40:13