2014-12-05 35 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