首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NestedRecyclerView问题-键盘出现后,第二个RecyclerView的最后一项复制到第一项中

NestedRecyclerView问题-键盘出现后,第二个RecyclerView的最后一项复制到第一项中
EN

Stack Overflow用户
提问于 2021-04-13 12:43:18
回答 1查看 95关注 0票数 1

我已经绝望了。

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

这就是最初的回收器视图。

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

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

代码语言:javascript
复制
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;
    }
}

内部适配器:

公共类SubAdapter扩展了RecyclerView.Adapter{

代码语言:javascript
复制
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;
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-13 12:49:09

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

代码语言:javascript
复制
private static List<Item> items;

应该是这样:

代码语言:javascript
复制
private List<Item> items;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67068847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档