android - RecyclerView项目:如何在每一行中保存视图的属性?

时间:2017-07-28 09:19:20

标签: android android-recyclerview

我的问题是了解RecyclerView的工作原理。我的RecyclerView每行都有一点点复杂的项目,但主要的是Item有一个孩子ImageView和{{1} }。我想按LinearLayout并将ImageView的{​​{1}}设置为VisibilityLinearLayout并轮换我的GONE。我尝试在VISIBLE

中执行此操作
ImageView

我在这里遇到了一些问题。

  • 我在onBindViewHolder中有一个布尔变量,我知道它错了,所以当我展开 holder.mIVExpandBtn.setOnClickListener(new OnClickListener() { boolean isOpen = false; @Override public void onClick(View v) { if (isOpen) { CounterListAdapter.this.notifyItemChanged(position); holder.mLLDetails.setVisibility(GONE); holder.mDivider.setVisibility(VISIBLE); holder.setArrowUp(false); isOpen = false; counterItem.setDetailsOpened(false); } else { holder.mLLDetails.setVisibility(VISIBLE); holder.mDivider.setVisibility(GONE); holder.setArrowUp(true); isOpen = true; counterItem.setDetailsOpened(true); } } }); 时它只会改变一次。如果我创建这个布尔全局变量,如果我为任何其他项扩展一行RecyclerView OnClickListener并且当我单击ImageView时它不会自我扩展..我应该在哪里放置这个布尔值?
  • 第二个问题 - 如何在屏幕旋转中保存RecyclerView行的状态?例如,我展开了我的一行LinearLayout,更改了屏幕方向并关闭了它。

2 个答案:

答案 0 :(得分:0)

对于你的第一个问题,你应该把你的布尔变量放在你定义你的视图的地方,也就是你的ViewHolder里面,以这种方式调用布尔值onClick的顺序

if(holder.isOpen)

通过这种方式,您可以将每个布尔值的引用保留到每一行。

对于您的第二个问题,解决方案非常简单。在清单中,在您拥有RecyclerView的活动中,定义以下内容:

android:configChanges="keyboardHidden|orientation|screenSize"

这可以防止在您旋转屏幕时重新创建配置更改时的活动,因此活动将保持其状态,因此您的RecyclerView将不会与您的适配器一起重新创建。

请注意,这意味着,如果您的活动未重新创建,onPauseonStop等将无法运行。这仅适用于屏幕旋转,您的活动仍将运行方法onConfigurationChanged(),您应该在屏幕旋转的情况下定义所需的任何更改。

答案 1 :(得分:0)

最好将OnClickListener放在Holder类中,如下所示:

private class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

  @Override
        public void onClick(View view) {
        ....
        }

关于如何保存状态我认为定义行的所有内容都应保存在传递给适配器构造函数的数组中,您可以在数组项目对象中添加保存行视图的VISIBILITY状态的字段。

在屏幕旋转上有两个选项:

1 - 正如@Ricardo所说避免活动娱乐

2 - onSaveInstanceState / onRestoreInstanceStates保存/恢复定义行的数组..我首选的方法是使用JSON并将其放在可以在Bundle中保存/恢复的字符串中。