删除项目后,Recyclerview不刷新

时间:2019-02-21 06:36:51

标签: android android-recyclerview

删除项目后,我的Recycler视图未更新。 此recyclerView位于片段中。 我已经尝试了所有方法,但没有任何效果。

  

片段类中的适配器声明

    notificationsTabAdapter = new NotificationsTabAdapter(getContext(), R.id.notificationsRecyclerView,
                notificationItemsList, cListner);
        layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(notificationsTabAdapter);
  

RecyclerViewAdapter:

public class NotificationsTabAdapter extends RecyclerView.Adapter<NotificationsTabAdapter.NotificationItemHolder> {

Boolean debug = false;
public static final String NOTIFICATION_ADAPTER = "NotificationAdapter";
private ArrayList<NotificationItemm> notificationItems;
private int layoutResID;
private int notificationposition;
private Context myContext;
public onNotificationItemClickListner mListner;


public interface onNotificationItemClickListner {
    void onNotificationItemDelete(int position);
}

public NotificationsTabAdapter(Context context, int resource, ArrayList<NotificationItemm> notificationList,
                               onNotificationItemClickListner listner) {
    myContext = context;
    layoutResID = resource;
    notificationItems = notificationList;
    notificationposition = 0;
    this.mListner = listner;
}

@NonNull
@Override
public NotificationItemHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.notifications_tab_item, viewGroup, false);
    NotificationsTabAdapter.NotificationItemHolder evh = new NotificationsTabAdapter.NotificationItemHolder(view, mListner);
    return evh;
}

@Override
public void onBindViewHolder(@NonNull final NotificationItemHolder notificationItemHolder, final int position) {

    final NotificationItemm currentItem = notificationItems.get(position);

    notificationItemHolder.mNotificationTextView.setText(currentItem.getNotification_name());
    notificationItemHolder.mNotificationURL = currentItem.getNotification_link();
    notificationItemHolder.mNotificationDate = currentItem.getNotification_date();
    notificationItemHolder.mNotificationRT = currentItem.getNotification_rT();

    notificationItemHolder.mNotificaionHolderLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });
    //to delete the notification
    notificationItemHolder.imageDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            deleteNotification(currentItem);

            mListner.onNotificationItemDelete(position);
        }
    });
}

@Override
public int getItemCount() {
    return notificationItems.size();
}

//Delete from View

public void deleteNotification(NotificationItemm todelete) {
    int notificationPosition = notificationItems.indexOf(todelete);
    notificationItems.remove(notificationPosition);
    notifyItemRemoved(notificationPosition);
    notifyItemChanged(notificationPosition);
    notifyDataSetChanged();
    notifyItemRemoved(notificationPosition);
    notifyItemChanged(notificationPosition);

    if (notificationItems.isEmpty()) {

    }
}

/**
 * VIEW HOLDER =================================================================================
 **/

public class NotificationItemHolder extends RecyclerView.ViewHolder {
    RelativeLayout mNotificaionHolderLayout;
    RelativeLayout notificationParentRelative;
    ImageView imageDelete;
    TextView mNotificationTextView;
    String mNotificationURL;
    String mNotificationDate;
    String mNotificationRT;

    public NotificationItemHolder(@NonNull View itemView, onNotificationItemClickListner listner) {

        super(itemView);
        mNotificationTextView = itemView.findViewById(R.id.NotificationTextView);
        mNotificaionHolderLayout = itemView.findViewById(R.id.notification__item_container);
        imageDelete = itemView.findViewById(R.id.notification_delete_image);
        notificationParentRelative = itemView.findViewById(R.id.rlNotificLayout);
        mNotificationRT = null;
        mNotificationURL = null;
        mNotificationDate = null;
    }
}

}

调试项目时,可以看到该项目实际上已从ArrayList中删除,但未在回收视图中进行更新。

删除后,如果滚动了recyclerview,则删除的项目将从recyclerview中删除。但并非没有滚动。

7 个答案:

答案 0 :(得分:1)

尝试一下。希望对您有用。

notificationItemHolder.imageDelete.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
           notificationItems.remove(position);
           notifyDataSetChanged();
    }

答案 1 :(得分:0)

尝试此操作以删除功能

public void deleteNotification(NotificationItemm todelete) {
    notificationItems.remove(todelete);
    notifyDataSetChanged();

}

答案 2 :(得分:0)

作为解决方法,您可以在FragmentClass中调用一个方法,该方法将新列表(已删除项目)加载到适配器中。从适配器调用此方法

public void MethodInFragmentClass(NotificationItemm todelete)
{
/*
... delete item 
*/
notificationsTabAdapter = new NotificationsTabAdapter(getContext(), R.id.notificationsRecyclerView,
                notificationDeletedItemsList, cListner);

                recyclerView.setAdapter(notificationsTabAdapter);
}

答案 3 :(得分:0)

在您的 NotificationsTabAdapter 中进行以下更改

   NotificationsTabAdapterListener notificationsTabAdapterListener;

   public interface NotificationsTabAdapterListener { // create an interface
        void onItemsDeleted(int position); // create callback function
    }

public NotificationsTabAdapter(Context context, int resource, ArrayList<NotificationItemm> notificationList,
                           NotificationsTabAdapterListener notificationsTabAdapterListener) {
myContext = context;
layoutResID = resource;
notificationItems = notificationList;
notificationposition = 0;
this.notificationsTabAdapterListener = notificationsTabAdapterListener;

}

      notificationItemHolder.imageDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
//perform normal remove operation here

notificationItems.remove(position);
            notificationsTabAdapterListener.onItemsDeleted(position);
        }
    });

并在片段中实现 NotificationsTabAdapterListener ,并在重写方法中使用以下代码

        @Override
public void onItemsDeleted(final int position) {
    notificationsTabAdapter.notifyDataSetChanged();
    recyclerView.post(new Runnable() {
        @Override
        public void run() {
            recyclerView.smoothScrollToPosition(position);

        }
    });
}

答案 4 :(得分:0)

在适配器中使用这样的回调:

private ICallback mICallback;

    public interface ICallback {

      void deleteItem(int position);
    }
    public SettingRecyclerViewAdapter(SettingMediator settingMediator, ICallback ICallback) {
        mICallback = ICallback;
        mSettingMediator = settingMediator;
    }

然后在您的Farf中通知数据集更改并像这样更新recyclerview:

public class YourFragment implements SettingContract.View, SettingRecyclerViewAdapter.ICallback {
.
.
.
    @Override
    public void deleteItem(int position) {

                //delete item from your list here
        mSettingRecyclerViewAdapter = new SettingRecyclerViewAdapter(yourList, this);
        mRecyclerView.setAdapter(mSettingRecyclerViewAdapter);
        mSettingRecyclerViewAdapter.notifyDataSetChanged();
    }


}

答案 5 :(得分:0)

尝试一下:

    notificationItemHolder.imageDelete.setTag(holder);
    notificationItemHolder.imageDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NotificationItemHolder viewholder = (NotificationItemHolder) v.getTag();
            notificationItems.remove(viewholder.getAdapterPosition());
            notifyDataSetChanged();
        }
    });

答案 6 :(得分:0)

您必须解析从Adapter类中的onclick侦听器到Interface方法(onitemClicked())的位置 然后,将接口类实现为Fragment类,并使用[listname.remove(position))删除接口方法上的位置 最终,使用adaptername.notifyDataSetChanged();

更新recyclerview UI

第1步:创建接口类

public interface RecyclerviewItemClickListener {


    void onitemClicked(View v, int position);
}

第2步:将位置传递给适配器类中的接口方法

notificationItemHolder.imageDelete.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        deleteNotification(currentItem);
        //use interface method & pass the position of the list to fragment for update UI .
        recyclerviewItemClickListener.onitemClicked(v,position);
    }
});

第3步:在片段中实现接口类和方法

@Override
    public void onitemClicked(View v, int position) {

        Listname.remove(Listname.get(position));
        RecyclerviewAdaptername.notifyDataSetChanged();
    }