当滚动视图滚出屏幕时,如何保存RecyclerView中一个项目的状态

3

在我的项目中,我有一个包含最多20个项的recyclerView。在行模板中,我有一个文本视图和一个初始情况下隐藏的按钮,当recyclerview项被点击时,按钮的可见性会被切换。问题是当第一行中的按钮被显示并且滚动出视图,然后再滚回来时,按钮又变得不可见了,而没有调用toogle visibility。如何在recycler view滚出视图时保存对象的状态呢?

3个回答

3
您的RecyclerView列表项的状态取决于它们所基于的List/Array中的对象,这些对象由您的适配器类使用。
如果您想保存已选状态,可以向您的对象类添加一个布尔字段来设置和保存值,以便在单击时更新适配器,并相应地设置按钮的可见性。
不要在您的ArrayList中使用字符串,而是使用一个简单的对象类来保存字符串和另一个布尔值,以控制按钮的可见性。
这样的类可能像这样:
        class Items {
        String myString;
        boolean visibility;

        public String getMyString(){
            return myString;
        }

        public boolean isVisible(){
            return visibility;
        }

        public void setVisibility(boolean visibility){
            this.visibility = visibility;
        }
    }

在您的RecyclerView中,您将拥有一个方法来设置列表项的值,我从未使用过,但我相信它被称为bindView?在此处,您设置列表项的文本值时,还应根据item.getVisibility()返回的值设置可见性,并在调用按钮的onClick方法时设置它。
希望这对您有所帮助。

我没有使用任何对象类,只是使用了一个数组列表。 - Sony
一个什么的ArrayList? - Ivan Wooll
一个字符串数组,只是为了填充行。 - Sony
我使用了哈希表来存储状态。感谢您的时间。 - Sony

0
你可以使用shared preference来实现这个目的。
在RecyclerView的点击事件中,将键值对插入到shared preference中,其中键应该是位置(position),值应该是true/false。
在你的适配器中实现一个if条件语句,用于判断item视图是否已创建。
if(sharedpreferences.contains(String.valueof(position)) && sharedpreferences.getString(String.valueof(position), "").equals("true")){

//button visible

}

else{
 // button gone/invisible
}

希望这能对你有所帮助


adapter.notifyDataSetChanged() 用于通知任何已注册的观察者数据集已更改,根据官方文档,它不用于保存任何状态。您可以在此链接阅读更多信息。 - Sony
@sony 你说得对。我更新了我的回答,请看一下。 - Shadik Khan
感谢您提供共享首选项的想法。我使用哈希映射来存储状态。感谢您的时间。 - Sony
先生,我想要这个问题的答案。我已经创建并设置了按钮可见性,但每当活动重新启动时,我们都需要再次设置可见性。我想实现您的答案,但不知道如何操作。这是我的问题和适配器类。能否请您帮忙:https://stackoverflow.com/questions/63332600/android-recycler-view-download-button-problem - Dhruvbhati

0

使用哈希映射来存储状态。当按钮被点击时,通过调用 getPosition() 来更新哈希映射中的位置和可见性。

 public void onClick(View v) {
                Btn.setVisibility(Btn.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);
                statesMap.put(getPosition(),Btn.getVisibility() == View.VISIBLE );
            }

然后通过传递位置,在

onBindViewHolder(MyViewHolder holder, int position)

中从哈希图中读取值

holder.Btn.setVisibility(statesMap.get(position) != null && statesMap.get(position) != false ? View.VISIBLE : View.GONE);

嗨,我想实现相同的功能,但是出现了错误。你能在我的问题上回答吗?我的适配器类已经上传到这里:https://stackoverflow.com/questions/63332600/android-recycler-view-download-button-problem - Dhruvbhati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接