【问题标题】:notifydatasetchanged not working from async tasknotifydatasetchanged 在异步任务中不起作用
【发布时间】:2017-03-31 14:11:56
【问题描述】:

嗨,我认为我的问题与此 notifyDataSetChanged not working on RecyclerView 有关 我试图从异步任务中刷新我的布局但是当我调用 notify datasetchanged 时没有任何反应,但是如果我创建适配器的新实例并调用 notifydatasetchanged 那么它确实有效我尝试了一些无济于事的事情并想知道我做错了什么,

我是这样引用的

 public ListAdapter cardAdapter;

然后在 onCreate 中,我初始化与我的回收站视图有关的所有内容,(这里唯一需要的是我如何初始化我的适配器,但为了清楚起见,我将添加与我的回收站视图有关的所有内容)

   staggeredGridLayoutManagerVertical = new 
   customLinearLayoutManager(this,customLinearLayoutManager.VERTICAL,false);
    recyclerView = (RecyclerView) findViewById(R.id.list_view);
    OnItemTouchListener itemTouchListener = new     
    FinalListActivity.OnItemTouchListener() {
        @Override
        public void onCardClick(View view, int position) {
            //removeAt(position);
            list.remove(position);
            cardAdapter.notifyItemRemoved(position);
        }

        @Override
        public void onCardLongClick(View view, int position) {
            //clearGrid();
        }
    };
    cardAdapter = new ListAdapter(list,this,itemTouchListener);
    recyclerView.setLayoutManager(staggeredGridLayoutManagerVertical);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(cardAdapter);
    //cardAdapter.notifyDataSetChanged();

    ItemTouchHelper.Callback callback =
            new SimpleItemTouchHelperCallback(cardAdapter);
    mItemTouchHelper = new ItemTouchHelper(callback);
    mItemTouchHelper.attachToRecyclerView(recyclerView);

如果我在这些方法之前将项目添加到列表中,那么我的回收器视图会显示信息,但我想要的是在异步任务中获取信息并在 onPostExecute 中填充列表,但是当我调用时

cardAdapter.notifyDataSetChanged();

从 onPostExecute 没有任何反应,有什么帮助吗?

编辑 添加适配器

public class ListAdapter extends  
RecyclerView.Adapter<ListAdapter.MyViewHolder> 
implements ItemTouchHelperAdapter{
private List<String> cardMakerList;
private OnStartDragListener mDragStartListener;
private FinalListActivity.OnItemTouchListener onItemTouchListener;

public class MyViewHolder extends RecyclerView.ViewHolder{
    public EditText cardText;
    public ImageView close;
    public ContentLoadingProgressBar progress;
    public ImageView handleView;
    public RelativeLayout cardBack;

    public MyViewHolder(View view){
        super(view);
        cardText = (EditText) view.findViewById(R.id.cardText);
        close = (ImageView) view.findViewById(R.id.close);
        cardBack =(RelativeLayout)view.findViewById(R.id.cardLayout);
        close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemTouchListener.onCardClick(v, getPosition());
            }
        });
        /*
        close.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                onItemTouchListener.onCardLongClick(v, getPosition());
                return true;
            }
        });
        */
        progress = (ContentLoadingProgressBar)  
        view.findViewById(R.id.progress);
        handleView = (ImageView)view.findViewById(R.id.handle);
    }

}
public ListAdapter(List<String> cardMakerList,OnStartDragListener 
dragStartListener,FinalListActivity.OnItemTouchListener onItemTouchListener) 
{
    this.cardMakerList = cardMakerList;
    mDragStartListener = dragStartListener;
    this.onItemTouchListener = onItemTouchListener;
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
    if (fromPosition < toPosition){
        for (int i = fromPosition; i < toPosition; i++){
            Collections.swap(cardMakerList,i,i+1);
        }
    }else{
        for (int i = fromPosition; i > toPosition; i--){
            Collections.swap(cardMakerList,i,i-1);
        }
    }
    notifyItemMoved(fromPosition,toPosition);
    return true;
}
@Override
public void onItemDismiss(int position) {
    cardMakerList.remove(position);
    notifyItemRemoved(position);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_view_holder, parent, false);
    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position)  
{
    String cardString = cardMakerList.get(position);
    holder.cardText.setText(cardString);
    holder.handleView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (MotionEventCompat.getActionMasked(event) ==
                    MotionEvent.ACTION_DOWN) {
                mDragStartListener.onStartDrag(holder);
            }
            return false;
        }
    });
    holder.close.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //cardMakerList.remove(position);
            return false;
        }
    });
}
@Override
public int getItemCount(){
    return cardMakerList.size();
}
}

【问题讨论】:

  • 我想帮助你。请给我看一下 cardAdapter 类的源代码
  • 如前所述,它正在工作,所以我认为我的适配器没有问题,但我将其发布到我的问题中@red_allocator

标签: android android-recyclerview adapter


【解决方案1】:

发生这种情况的原因有很多,其中之一是list 变量没有被更新,因为在某些时候它会丢失它的主实例并且适配器不再监听它。在这种情况下,您应该在适配器中实现类似

的方法
public void refreshMyList(List<String> list){
    this.cardMakerList.clear();
    this.cardMakerList.addAll(list);
    this.notifyDataSetChanged();
}

现在,每次您想刷新 RecyclerView 时,只需使用新列表调用此方法即可。

【讨论】:

  • 我不知道这可能是一个原因,但我该怎么称呼它
  • onPostExecute 而不是调用 cardAdapter.notifyDataSetChanged();调用 cardAdapter.refreshMyList(newList);
  • 对不起,我确实尝试过,但由于某种原因它不起作用,但现在是这样,你的回答解决了我的问题,一切正常,非常感谢你
猜你喜欢
  • 2012-05-18
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多