Android Searchview for listview->如何修改适配器
我真的需要一些关于SearchView和我的带有自定义列表项的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;
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。