gpt4 book ai didi

java - 显示空 View 后过滤器列表不会重新出现

转载 作者:行者123 更新时间:2023-12-02 04:34:27 24 4
gpt4 key购买 nike

由于某种原因,在显示没有匹配项的空 View 后,从搜索 View 中删除所有文本后,我的 ListView 将不会重新出现。

Within my adapter class, AFAIK .clear() in mData.clear(); needs to change to something else but I don't know what to.

ItemListAdapter 类

public class ItemListAdapter extends BaseAdapter implements Filterable {

private List<Victoria> mData;
private List<Victoria> mFilteredData;
private LayoutInflater mInflater;
private ItemFilter mFilter;

public ItemListAdapter (List<Victoria> data, Context context) {
mData = data;
mFilteredData = new ArrayList(mData);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return mFilteredData.size();
}

@Override
public String getItem(int position) {
return mFilteredData.get(position).getItem();
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_row, parent, false);
holder = new ViewHolder();

holder.title = (TextView) convertView.findViewById(R.id.item_title);
holder.description = (TextView) convertView.findViewById(R.id.item_description);

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.title.setText(mFilteredData.get(position).getItem());
holder.description.setText(mFilteredData.get(position).getItemDescription());

return convertView;
}

@Override
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ItemFilter();
}
return mFilter;
}

/**
* View holder
*/
static class ViewHolder {
private TextView title;
private TextView description;
}

/**
* Filter for filtering list items
*/
/**
* <p>An array filter constrains the content of the array adapter with
* a prefix. Each item that does not start with the supplied prefix
* is removed from the list.</p>
*/
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();

if (TextUtils.isEmpty(constraint)) {
results.count = mData.size();
results.values = mData;
} else {
//Create a new list to filter on
List<Victoria> resultList = new ArrayList<Victoria>();
for (Victoria str : mData) {
if (str.getItemDescription().toLowerCase().contains(constraint.toString().toLowerCase())) {
resultList.add(str);
}
}
results.count = resultList.size();
results.values = resultList;
}
return results;
}

/**
* Runs on ui thread
* @param constraint the constraint used for the result
* @param results the results to display
*/
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results.count == 0) {
//Make list invisible
//Make text view visible
mFilteredData.clear();
notifyDataSetInvalidated();
} else {
mFilteredData = (ArrayList<Victoria>)results.values;
notifyDataSetChanged();
}
}
}
}

过滤前 enter image description here

使用无效字符过滤后 enter image description here

清除搜索 View 并尝试再次显示列表后 enter image description here

最佳答案

几个小修复应该可以让一切顺利进行。首先,mDatamFilteredData 数据应始终是两个不同的实例。在构造函数中,将 mFilteredData 设为从 mData 复制的新实例

mFilteredData = new ArrayList(mData);

此外,在Filter中,您需要将相应的代码更新为以下内容:

if (TextUtils.isEmpty(constraint)) {
results.count = mData.size();
results.values = new ArrayList(mData);
}

那么您的 getView() 方法应该从 mFilteredData 而不是 mData 中提取。但理想情况下,getView() 方法应该使用 getItem(position) 方法来访问数据。这样,如果您更改数据访问位置的实现细节,则不必记住单独更新 getView() 方法。

最后,顺便说一句,您的过滤代码之所以有效,只是因为适配器不会改变 mFilteredDatamData。通常,必须高度同步过滤进程和适配器的其他部分,因为 performFiltering() 发生在后台线程上。如果您计划在构建后添加对修改适配器数据的支持...那么您需要开始添加同步 block 。

关于java - 显示空 View 后过滤器列表不会重新出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31014764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com