android - 嵌套 RecyclerView 问题 - 键盘出现后,第二个 RecyclerView 的最后一项被复制到第一个 RecyclerView 中

标签 android android-recyclerview

我很绝望。

我有一个嵌套的回收器 View 。每个外部元素都有一个内部元素数组。已为内部元件创建了不同的适配器。我正在创建“KairosWithEvents”类的外部元素数组,其中每个元素都包含“Event”类的内部元素。一切都显示得很好。添加元素后,所有内容也会更新。为了进行测试,我创建了“KairosWithEvent”类的两个对象。在第一个对象中,我放置了“Event”类的两个对象,在第二个对象中放置了三个对象。但是当我想更改 EditText 值时,键盘就会出现。第二个对象的最后一个元素出现在第一个对象中。我该如何修复它?对象未移动或重复,但显示不正确。

这就是嵌套回收器 View 最初的样子。

enter image description here

这就是键盘出现后嵌套回收器 View 的样子。由于某种原因,“Эвент5”元素被复制到第一个元素。

enter image description here

这是我的代码:外部适配器:

public class EventAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static List<Item> items;
    private static RecyclerViewClickInterface listener;
    private RecyclerView.RecycledViewPool sharedPool = new RecyclerView.RecycledViewPool();
    private Context context;

    public EventAdapter() {
        items = new ArrayList<>();
        this.context = context;
    }

    public EventAdapter(List<Item> newItems){
        items = newItems;


    }


    class KairosViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {

        private TextView title;
        private CheckBox iv;
        private RecyclerView rv;

        public KairosViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.tv);
            iv = itemView.findViewById(R.id.iv);
            rv = itemView.findViewById(R.id.rvSteaks);
            itemView.setBackgroundColor(Color.parseColor("#91b3f2"));
            itemView.setOnClickListener(this);
            itemView.setOnLongClickListener(this);
        }

        @RequiresApi(api = Build.VERSION_CODES.N)
        void bind(KairosWithEvents kairosWithEvents){

            title.setText(kairosWithEvents.kairos.kairosId + " = " + kairosWithEvents.kairos.title);

            LinearLayoutManager layoutManager = new LinearLayoutManager(
                    rv.getContext(),
                    LinearLayoutManager.VERTICAL,
                    false);

            List<Item> itemsEvents = new ArrayList<>();

            kairosWithEvents.events.forEach(i -> itemsEvents.add(new Item(Constants.EVENT_KAIROS, i)));


            SubAdapter childAdapter = new SubAdapter(itemsEvents);
            rv.setLayoutManager(layoutManager);
            rv.setAdapter(childAdapter);
            rv.setRecycledViewPool(sharedPool);

        }

        @Override
        public void onClick(View view) {
            int position = getAdapterPosition();
            if (listener != null && position != RecyclerView.NO_POSITION){
                listener.onItemKairosWithEvents( ((KairosWithEvents) items.get(position).object) );
            }
        }

        @Override
        public boolean onLongClick(View view) {
            return false;
        }
    }


    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        switch (viewType){
            case Constants.KAIROS:
                return new KairosViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item_ex, parent, false));
        }
        return null;
    }

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
       switch (getItemViewType(position)){
           case Constants.KAIROS:
               KairosWithEvents kairos = ((KairosWithEvents) items.get(position).object);
               ((KairosViewHolder) holder).bind(kairos);
               break;

       }
    }

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

    @Override
    public int getItemViewType(int position) {
        return items.get(position).type;
    }
}

内部适配器:

公共(public)类 SubAdapter 扩展了 RecyclerView.Adapter{

private static List<Item> items;


public SubAdapter(List<Item> newItems) {
    items = newItems;
}

static class EventViewHolder extends RecyclerView.ViewHolder {

    private TextView title;

    public EventViewHolder(@NonNull View itemView) {
        super(itemView);
        title = itemView.findViewById(R.id.tv);
        itemView.setBackgroundColor(Color.parseColor("#ffc8a8"));
    }

    void bind(Event event){
        title.setText(event.eventId + " = " + event.title);
    }
}


@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    switch (viewType) {
        case Constants.EVENT_KAIROS:
            return new EventViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item_sub, parent, false));
    }
    return null;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    switch (getItemViewType(position)){
        case Constants.EVENT_KAIROS:
            Event event = (Event) items.get(position).object;
            ((EventViewHolder) holder).bind(event);
            break;

    }
}

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

@Override
public int getItemViewType(int position) {
    return items.get(position).type;
}

}

最佳答案

SubAdapter 中,从 items 字段中删除 static 关键字:

private static List<Item> items;

应该是这样的:

private List<Item> items;

您应该对外部适配器进行相同的更改,但由于一次只有一个,因此不会导致问题。

关于android - 嵌套 RecyclerView 问题 - 键盘出现后,第二个 RecyclerView 的最后一项被复制到第一个 RecyclerView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67068847/

相关文章:

安卓 : How to manage fragments in a single Activity?

android - 插页式广告显示黑色 (->) AFMA_ReceiveMessage 未定义 ( :1)

java - SQLite 查询 - 一旦找到特定项目就停止从数据库返回行

android - SpanGroupIndex 和 SpanIndex 回收器 View

java - 添加 admob 横幅广告时出现 RecyclerView ClassCastException

java - 安卓 : Camera's dimensions doesn't match screen's dimensions

android - 无法构建 tess-two 库

android - Kotlin 过滤器在 RecyclerView 中搜索 EditText

java - 为什么 Recyclerview 列表在所有位置返回相同的项目?

android - 为 recyclerview 实现上下文操作栏