[英]Refreshing listView Items android
我的問題是我實現了在列表視圖項上具有可過濾功能的搜索視圖。 它運作良好,但是執行搜索並且searchView
為空后,我無法獲得之前的項目。 我試過notifyDataSetChanged
但對我來說不起作用。 我該怎么辦?
....
private ListView mListNotes;
NoteListAdapter na;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListNotes = (ListView) findViewById(R.id.main_listview);
mListNotes.setTextFilterEnabled(true);
}
@Override
protected void onResume() {
super.onResume();
//load data into the listview and display
mListNotes.setAdapter(na);
}
@Override
public boolean onQueryTextChange(String query) {
if (!query.equals("")) {
na.getFilter().filter(query); // filter listView items when text is inputted.
} else {
na.notifyDataSetChanged(); // what do i put here to refresh my list view after search?
}
return false;
}
}
// ListView Adapter
class NoteListAdapter extends ArrayAdapter<Note> implements Filterable{
List<Note> objects;
private List<Note> mStringFilterList;
Filter filter;
private static final int WRAP_CONTENT_LENGTH = 5;
public NoteListAdapter(Context context, int resource, List<Note> objects) {
super(context, resource, objects);
this.objects = objects;
this.mStringFilterList = objects;
}
@Override
public int getCount() {
return objects.size();
}
@Nullable
@Override
public Note getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
ArrayList<Note> tempList= new ArrayList<>();
FilterResults results = new FilterResults();
if (constraint != null && objects != null) {
for(Note singleNote : objects) {
if( singleNote.getTitle().contains(constraint))
tempList.add(singleNote);
}
results.values = tempList;
results.count = tempList.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
objects = (ArrayList<Note>) results.values;
notifyDataSetChanged();
}
};
return filter;
}
}
}
您正在用過濾后的數據替換原始數據。 使用以下代碼:
class NoteListAdapter extends ArrayAdapter<Note> implements Filterable {
List<Note> objects;
private List<Note> originalList = new ArrayList<>();
Filter filter;
private static final int WRAP_CONTENT_LENGTH = 5;
public NoteListAdapter(Context context, int resource, List<Note> objects) {
super(context, resource, objects);
this.objects = objects;
this.originalList.addAll(objects);
}
@Override
public int getCount() {
return objects.size();
}
@Nullable
@Override
public Note getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
ArrayList<Note> tempList = new ArrayList<>();
FilterResults results = new FilterResults();
if (objects != null) {
if(constraint != null && !constraint.equals("")) {
for (Note singleNote : objects) {
if (singleNote.getTitle().contains(constraint))
tempList.add(singleNote);
}
results.values = tempList;
results.count = tempList.size();
}else {
tempList.clear();
tempList.addAll(originalList);
results.values = tempList;
results.count = tempList.size();
}
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
objects = (ArrayList<Note>) results.values;
notifyDataSetChanged();
}
};
return filter;
}
}
希望能幫助到你:)
閱讀注釋,其中代碼需要更改或替換整個適配器類。
class NoteListAdapter extends ArrayAdapter<Note> implements Filterable
{
List<Note> objects;
private List<Note> mStringFilterList;
Filter filter;
private static final int WRAP_CONTENT_LENGTH = 5;
public NoteListAdapter(Context context, int resource, List<Note> objects) {
super(context, resource, objects);
this.objects = objects;
this.mStringFilterList = objects;
}
@Override
public int getCount() {
return mStringFilterList.size(); // change this line
}
@Nullable
@Override
public Note getItem(int position) {
return mStringFilterList.get(position); // change this line
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
ArrayList<Note> tempList= new ArrayList<>();
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0 && objects != null) {
for(Note singleNote : objects) {
if( singleNote.getTitle().contains(constraint))
tempList.add(singleNote);
}
results.values = tempList;
results.count = tempList.size();
}
// add else block.
else
{
results.values = objects;
results.count = objects.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mStringFilterList = (ArrayList<Note>) results.values; // change this line
notifyDataSetChanged();
}
};
return filter;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.