notifydatasetchanged无法通过异步任务运行 [英] notifydatasetchanged not working from async task

查看:59
本文介绍了notifydatasetchanged无法通过异步任务运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我认为我的问题与此> notifyDataSetChanged不适用于RecyclerView 有关我试图从异步任务中刷新布局,但是当我调用通知数据集已更改时,什么也没有发生,但是如果我创建适配器的新实例并调用notifydatasetchanged,则它确实有效,我尝试了几件事无济于事,想知道我在做什么错,

hi i think my issue is related to this notifyDataSetChanged not working on RecyclerView im trying to refresh my layout from an async task but when im calling notify datasetchanged nothing happens, but if i create a new instance of the adapter and call notifydatasetchanged then it does work ive tried a few things to no avail and wonder what im doing wrong,

我这样引用

 public ListAdapter cardAdapter;

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

then in onCreate i initialise everything to do with my recycler view, (the only bit thats needed here is how i initialise my adapter but for clarity ill add everything to do with my recycler view)

   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中填充列表,但是当我调用

if i add items to the list before these methods then my recycler view shows the information but what i want is to grab the information in an async task and populate the list in onPostExecute but when i call

cardAdapter.notifyDataSetChanged();

从onPostExecute什么都没有发生,没有任何帮助吗?

from onPostExecute nothing happens, any help?

编辑添加适配器

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();
}
}

推荐答案

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

There is many reasons that this might occur, and one of them is the list variable is not being updated because at some point it loses it's primary instance and the adapter no longer listens to it. In this case you should implement in your adapter a method like

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

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

Now every time you want to refresh the RecyclerView just call this method with the new list.

这篇关于notifydatasetchanged无法通过异步任务运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆