【问题标题】:How to handle UI changes from interaction with a view when using a RecyclerView?使用 RecyclerView 时如何处理与视图交互的 UI 更改?
【发布时间】:2019-10-27 09:06:53
【问题描述】:

如果我们有一个 RecyclerView 将有不同类型的视图,我们可以根据项目类型扩展我们需要的视图,例如

@Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
        View view = null;
        switch (type) {
            case TYPEX:  
               view = LayoutInflater
                    .from(viewGroup.getContext())
                    .inflate(R.layout.typex, viewGroup, false);
                    return new ViewHolderX(view);
            case TYPEY:
                view = LayoutInflater
                    .from(viewGroup.getContext())
                    .inflate(R.layout.typey, viewGroup, false);
                return new ViewHolderY(view);
        }
        return null;
    }

到目前为止一切顺利。然后这些视图可以在ViewHolder 中重用

问题:
如果TYPEX 视图有一个按钮,按下该按钮会更改视图中的某些内容,例如背景颜色,这意味着当视图被回收时,用户从未按下按钮的其他项目的颜色将有所不同。
由于它与视图必须从适配器显示的数据的任何条件无关,如何解决这个问题?

【问题讨论】:

    标签: android android-layout android-view android-recyclerview


    【解决方案1】:

    您应该将您的属性 [background color] 存储在模型中并据此做出决定。

    class Model {
    
        ...
    
        private int backgroundColor = 0xFFFFFF;
    
        public int getBackgroundColor() {
            return backgroundColor;
        }
    
        public void setBackgroundColor(int backgroundColor) {
            this.backgroundColor = backgroundColor;
        }
    
        ...
    
    }
    

    句柄单击此处并更新背景颜色。

    @Override
    public void onBindViewHolder(@NonNull final SuggestionHomeAdapter.ViewHolder holder, final int position) {
    
        final Model model = modelItems.get(position);
    
        holder.rootView.setBackgroundColor(model.getBackgroundColor());
    
        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(model.getBackgroundColor() != 0xFFFF0000){
                    model.setBackgroundColor(0xFFFF0000);
                    notifyItemChanged(position);
                }
            }
        });
    }
    

    它坚持模型的位置而不是视图。所以只有那些被用户点击的受影响的项目。谢谢

    【讨论】:

    • 该类如何与ViewHolders 或列表中的特定视图相关联?
    • 如果每个视图都有一个Model,这意味着一个回收的视图将有一个具有更新颜色的模型
    • 这里Model 是一个例子。您的不同类型的回收器项目应该与某个模型相关联,对吗?我的意思是那个模型
    • 不,我不使用模型。我只是设置我直接得到的数据。如果我使用您描述的模型,那么在按钮上单击该视图的模型将会改变。现在在回收站上,模型不会改变吗?因此,即使用户没有与该视图交互,模型仍会显示更新状态的颜色。你能给我看一个使用模型的例子吗?
    • 这有帮助,但它假设Model 或该属性与所有职位相关,尽管我有一个具有完全不同观点的RecyclerView。尽管背景更改可能与任何视图相关,但如果更改是针对特定视图类型的更具体的内容怎么办?
    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2015-10-08
    • 2011-08-19
    相关资源
    最近更新 更多