0

我有一个嵌套的回收器视图,单击哪个子项我希望整个子回收器视图设置可见性消失。

我已经尝试了一些方法来做到这一点。但是不断丢失回收站视图状态并且错误的数据显示出来了。请帮忙。

这是ParentAdapter.java代码

public class MessageListAdapter extends RecyclerView.Adapter {
    private Context mContext;
    private static final int VIEW_TYPE_MESSAGE_SENT = 1;
    private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;
    private List<Payload> chatMessageList;
    private RecyclerView.RecycledViewPool recycledViewPool;
    private OnItemClickListener onItemClickListener;

    MessageListAdapter(Context context, List<Payload> chatMessageList, OnItemClickListener onItemClickListener) {
        this.mContext = context;
        this.chatMessageList = chatMessageList;
        this.onItemClickListener = onItemClickListener;
        recycledViewPool = new RecyclerView.RecycledViewPool();
    }

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

    // Determines the appropriate ViewType according to the sender of the message.
    @Override
    public int getItemViewType(int position) {
        Payload message = chatMessageList.get(position);
        if (TextUtils.equals(message.getUserType(), "USER")) {
            // If the current user is the sender of the message
            return VIEW_TYPE_MESSAGE_SENT;
        } else {
            // If some other user sent the message
            return VIEW_TYPE_MESSAGE_RECEIVED;
        }
    }


    // Inflates the appropriate layout according to the ViewType.
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        if (viewType == VIEW_TYPE_MESSAGE_SENT) {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_user_msg, parent, false);
            return new SentMessageHolder(view);
        } else {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_bot_msg, parent, false);
            return new ReceivedMessageHolder(view);
        }
    }


    // Passes the message object to a ViewHolder so that the contents can be bound to UI.
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        Payload chatMessage = chatMessageList.get(position);
        switch (holder.getItemViewType()) {
            case VIEW_TYPE_MESSAGE_SENT:
                ((SentMessageHolder) holder).bind(chatMessage.getMessage(), getFormattedTime());
                break;
            case VIEW_TYPE_MESSAGE_RECEIVED:
                ((ReceivedMessageHolder) holder).bind(chatMessage.getMessage(), getFormattedTime());
                ((ReceivedMessageHolder) holder).bindRv(chatMessage, mContext, recycledViewPool, onItemClickListener);
                break;
        }
    }

    private static class SentMessageHolder extends RecyclerView.ViewHolder {
        TextView txtViewChatMsgUser;
        TextView txtViewDateTimeUser;

        SentMessageHolder(View itemView) {
            super(itemView);
            txtViewChatMsgUser = itemView.findViewById(R.id.txtViewChatMsgUser);
            txtViewDateTimeUser = itemView.findViewById(R.id.txtViewDateTimeUser);
        }

        void bind(String message, String time) {
            txtViewChatMsgUser.setText(message);
            txtViewDateTimeUser.setText(time);
        }
    }

    private class ReceivedMessageHolder extends RecyclerView.ViewHolder {
        TextView txtViewChatMsgBot;
        RecyclerView rvDeepLink;
        TextView txtViewDateTimeBot;

        ReceivedMessageHolder(View itemView) {
            super(itemView);
            txtViewChatMsgBot = itemView.findViewById(R.id.txtViewChatMsgBot);
            rvDeepLink = itemView.findViewById(R.id.itemRvDeepLink);
            txtViewDateTimeBot = itemView.findViewById(R.id.txtViewDateTimeBot);
        }

        void bind(String message, String time) {
            txtViewChatMsgBot.setText(message);
            txtViewDateTimeBot.setText(time);
        }

        void bindRv(Payload chatMessage, Context context, RecyclerView.RecycledViewPool recycledViewPool, OnItemClickListener onItemClickListener) {
            if (chatMessage.getData() != null && !chatMessage.isOptionSelected()) {
                DeepLinkAdapter deepLinkAdapter = new DeepLinkAdapter(context, chatMessage.getData(), onItemClickListener, getAdapterPosition());
                LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
                linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
                rvDeepLink.setLayoutManager(linearLayoutManager);
                rvDeepLink.setAdapter(deepLinkAdapter);
                rvDeepLink.setRecycledViewPool(recycledViewPool);
                deepLinkAdapter.notifyDataSetChanged();
            } else {
                rvDeepLink.setVisibility(View.GONE);
            }
        }
    }

    private String getFormattedTime() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("hh.mm aa", Locale.ENGLISH);
        return dateFormat.format(new Date());
    }


    public void clearData() {
        chatMessageList.clear();
        notifyDataSetChanged();
    }

    public void onSelected(int position) {
        chatMessageList.get(position).setOptionSelected(true);
        notifyItemChanged(position);
    }
}

这是我的ChildAdapter.java代码:

public class DeepLinkAdapter extends RecyclerView.Adapter<DeepLinkAdapter.DeepLinkViewHolder> {

    private List<DataItem> dataItemList;
    private Context context;
    private OnItemClickListener onItemClickListener;
    private int parentPos;

    DeepLinkAdapter(Context context, List<DataItem> dataItemList, OnItemClickListener onItemClickListener, int parentPos) {
        this.context = context;
        this.dataItemList = dataItemList;
        this.onItemClickListener = onItemClickListener;
        this.parentPos = parentPos;
    }

    @NonNull
    @Override
    public DeepLinkViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new DeepLinkViewHolder(LayoutInflater.from(context).inflate(R.layout.inner_bot_msg, parent, false), onItemClickListener, parentPos);
    }

    @Override
    public void onBindViewHolder(@NonNull final DeepLinkViewHolder holder, final int position) {
        DataItem dataItem = dataItemList.get(position);
        if (TextUtils.isEmpty(dataItem.getDeeplink())) {
            holder.deepLinkText.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
        } else {
            holder.deepLinkText.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_right_arrow, 0);
        }
        if (!TextUtils.isEmpty(dataItem.getText())) {
            holder.deepLinkText.setVisibility(View.VISIBLE);
            holder.deepLinkText.setText(dataItem.getText());
        } else {
            holder.deepLinkText.setVisibility(View.GONE);
        }
    }

    @Override
    public int getItemCount() {
        if (dataItemList != null) {
            return dataItemList.size();
        } else {
            return 0;
        }
    }


    class DeepLinkViewHolder extends RecyclerView.ViewHolder {
        private TextView deepLinkText;

        DeepLinkViewHolder(View itemView, OnItemClickListener onItemClickListener, int parentPos) {
            super(itemView);
            deepLinkText = itemView.findViewById(R.id.innerDeepLinkMsgText);
            if (onItemClickListener != null) {
                deepLinkText.setOnClickListener(v -> {
                    onItemClickListener.onItemClick(getAdapterPosition(), parentPos);
                });
            }
        }
    }
}

这是我在活动中的点击侦听器代码:

@Override
    public void onItemClick(int childPos, int parentPos) {
        if (TextUtils.isEmpty(chatMessageList.get(parentPos).getData().get(childPos).getDeeplink())) {
            String message = chatMessageList.get(parentPos).getData().get(childPos).getText();
            if (!viewModel.sendMessage(message)) {
                setMessage(getString(R.string.error_something_went_wrong), ChatBotManager.UserType.BOT.toString());
            } else {
                messageListAdapter.onSelected(parentPos);
                setMessage(message, ChatBotManager.UserType.USER.toString());
            }
        } else {
            if (TextUtils.equals(chatMessageList.get(parentPos).getData().get(childPos).getDeeplink(), "restart")) {
                if (messageListAdapter != null) {
                    messageListAdapter.clearData();
                    viewModel.sendMessage("start");
                }
            } else {
                String uri = chatMessageList.get(parentPos).getData().get(childPos).getDeeplink();
                Intent newIntent = new Intent(ApplicationClass.getContext(), TalkLinkingActivity.class);
                newIntent.setData(Uri.parse(uri));
                newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(newIntent);
                finish();
            }
        }
    }

请帮助我在这里缺少的东西,我的目标是从 Activity 的子适配器中获得一个点击监听器,并且在点击该项目之后,我想删除整个回收器视图。就像 Swiggy 中的聊天机器人一样。

4

1 回答 1

0

有一个方法DeepLinkAdapter可以清除整个列表:

public class DeepLinkAdapter extends RecyclerView.Adapter<DeepLinkAdapter.DeepLinkViewHolder> {

.......

public void clearTheWholeList(){
dataItemList.clear();
notifyDataSetChanged();
}

}

有一个方法MessageListAdapter可以完全删除一个项目:

public class MessageListAdapter extends RecyclerView.Adapter {
......
......
private int positionToClear = -1;



public void removeItem(int position){

positionToClear = position;
notifyDataSetChanged();


}

//in onBindViewHolder

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
............
............
//pass the positionToClear here
((ReceivedMessageHolder) holder).bindRv(chatMessage, mContext, recycledViewPool, onItemClickListener , positionToClear);

}



.......

}

ReceivedMessageHolder

private class ReceivedMessageHolder extends RecyclerView.ViewHolder {


//here add new param for removed position
void bindRv(Payload chatMessage, Context context, RecyclerView.RecycledViewPool recycledViewPool, OnItemClickListener onItemClickListener, int positionToClear) {

 if (chatMessage.getData() != null && !chatMessage.isOptionSelected()) {
 DeepLinkAdapter deepLinkAdapter = new DeepLinkAdapter(context, chatMessage.getData(), onItemClickListener, getAdapterPosition());

//do a check here
if(getAdapterPosition() == positionToClear){
deepLinkAdapter.clearTheWholeList();
}

.......
.......
.......

} else {
rvDeepLink.setVisibility(View.GONE);
}
}


}

假设onItemClick接口正常工作:

@Override
public void onItemClick(int childPos, int parentPos) {

...........
...........

//somewhere where you want the item to be removed

messageListAdapter.removeItem(parentPos);

............
............

}
于 2020-05-07T16:38:43.237 回答