【问题标题】:Adapter does not refreshing适配器不刷新
【发布时间】:2016-09-22 09:24:08
【问题描述】:

我想在两种情况下刷新我的适配器,但什么也没发生。首先我尝试调用

 adapter.clear();
 adapter.addAll(filteredList); //filtered list is a new list to show on adapter 
 adapter.notifyDataSetChanged();

第二次我尝试通过notifyDataSetInvalidated();在我的过滤器中刷新它

我的适配器类:

public class DatabaseAdapter extends ArrayAdapter<Exhibition>  {

    private Context context;
    private List<Exhibition> records;
    private List<Exhibition>filterRecords;
    private Dao<Exhibition, Integer> exhibitionDAO;
    private ViewHolder viewHolder;
    private SearchFilter searchFilter;

    public DatabaseAdapter(Context context,
                           int itemView,
                           List objects,
                           Dao<Exhibition, Integer> exhibitionDAO) {
        super(context, itemView, objects);
        this.context=context;
        this.records = new ArrayList<>(objects);
        this.filterRecords=new ArrayList<>(objects);
        this.searchFilter=new SearchFilter();
        this.exhibitionDAO = exhibitionDAO;

    }

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

        final Exhibition exhibition= records.get(position);

        if(view==null){
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view= inflater.inflate(R.layout.museum_list_item_layout,parent,false);
            viewHolder = new ViewHolder();
            view.setTag(viewHolder);
        }else
            viewHolder = (ViewHolder) view.getTag();
        viewHolder.eventName=(TextView)view.findViewById(R.id.list_item);
            viewHolder.eventName.setText(exhibition.getName());

        return view;
    }

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

    @Override
    public Filter getFilter() {
        if(searchFilter==null)
            searchFilter=new SearchFilter();
        return searchFilter;
    }

    public class ViewHolder{
        TextView eventName;
    }

    private class SearchFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            List<Exhibition> list;
            if (constraint == null || constraint.length() == 0){
                list = new ArrayList<Exhibition>(records);
                results.values = list;
                results.count = list.size();}
                else{
         try{

             list  = exhibitionDAO.queryBuilder().where().like("name","%"+constraint+"%").query();
             synchronized (list){
             results.values=list;
             results.count=list.size();}
         }
         catch (SQLException e){e.printStackTrace();}}
            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filterRecords = (ArrayList<Exhibition>)results.values;
            notifyDataSetChanged();
            clear();
            int count = filterRecords.size();

            for(int i = 0; i<count; i++){
                add(filterRecords.get(i));
                notifyDataSetInvalidated();
            }
        }
    }
    }

更新:我通过添加两个函数解决了我的问题:

public void addAllItems(List< Exhibition> exhibitions){
        records.clear();
        records.addAll(exhibitions);
    }
    public void addItems(List<Exhibition> exhibitions){
        records.addAll(exhibitions);
    }

一个是刷新所有项目,第二个是添加到列表中。我想这不是非常有效的解决方案。如果有人给我提示如何改进,我将不胜感激。

【问题讨论】:

  • 使用 ArrayAdapter 作为基类的原因是什么? ArrayAdapter.clear() 使数据集失效,之前notifyDataSetChanged 的意义何在? ...与ArrayAdapter.add() 的故事相同
  • 我认为我应该通过 adapter.clear() 删除适配器中的所有项目,而不是添加新项目并通知更改。
  • @Override public int getCount() { return records.size(); } ... public View getView(int position, View view, ViewGroup parent) { final Exhibition exhibition= records.get(position); 您没有使用AA.getCount 的默认实现...并且您没有在AA.getView() 实现中使用AA.getItem() ...所以使用AA.clearAA.add没有意义
  • 删除 getCount() 后 AA.clear 和 AA.add 工作并且列表正在刷新,但它在使用过滤器时通过抛出 IndexOutOfBoundsException:| 崩溃
  • 那么你有一些想法如何刷新列表并离开getCount?

标签: android refresh adapter notify notifydatasetchanged


【解决方案1】:

试试这个:

    filteredList.clear();

    adapter.notifyDataSetChanged();

【讨论】:

  • 他也可以试着倒立……关键是:为了什么? ... getCount 和 getView 正在使用 recordsfilteredList 没有连接 ...清除 filteredList 然后调用 notifyDataSetChanged 根本没有意义...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多