Android 在方向更改期间保存回收器视图的实例

Android 在方向更改期间保存回收器视图的实例,android,android-recyclerview,orientation-changes,onconfigurationchanged,scroll-position,Android,Android Recyclerview,Orientation Changes,Onconfigurationchanged,Scroll Position,我有一个RecyclerView,它是使用Arraylist构建的。Arraylist由名为ListItem的用户定义对象组成 每个recyclerview都有一个卡片视图。每个cardwiew保存每个列表项。 我已从该RecyclerView中删除了一个CardView 当我旋转屏幕时,会创建一个新的活动,从而显示旧数据。但是我希望recyclerview只保存更新列表,并且应该保留滚动位置 ListItem类: 主要活动类别: class MainActivity:AppCompatActi

我有一个
RecyclerView
,它是使用
Arraylist
构建的。
Arraylist
由名为
ListItem
的用户定义对象组成

每个
recyclerview
都有一个卡片视图。每个
cardwiew
保存每个
列表项。
我已从该
RecyclerView
中删除了一个
CardView

当我旋转屏幕时,会创建一个新的活动,从而显示旧数据。但是我希望
recyclerview
只保存
更新列表
,并且应该
保留
滚动位置

ListItem类:

主要活动类别:

class MainActivity:AppCompatActivity(){
私有lateinit var mSportsData:ArrayList
私有lateinit var mAdapter:MyAdapter
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val gridColumnCount=resources.getInteger(R.integer.grid\u column\u count)
recycler\u view.layoutManager=GridLayoutManager(此为gridColumnCount)
mSportsData=ArrayList()
recycler_视图。setHasFixedSize(真)
初始化数据()
回收器_view.adapter=mAdapter
变量swipiders=0

如果(gridColumnCount看起来initializeData被调用了两次,因为在方向更改时再次调用onCreate,您可以使用一些布尔值来检查数据是否已经初始化,然后跳过初始化

您所做的是删除传递给recyclerview的值,但当方向更改时recyclerview从“活动”重新加载,“活动”中的原始数据会再次传递,并且不会发生任何更改,因此,如果要在“recyclerview”中保存更改,则必须更改“活动”中的原始数据,以便在视图重新加载数据时,数据是相同的。

如果具有相同的布局,则可以在清单中限制活动重新启动t表示纵向和横向模式

将其添加到清单中的活动中

 <activity android:name=".activity.YourActivity"
    android:label="@string/app_name"
    android:configChanges="orientation|screenSize"/>
。因此,当您拥有自己的类类型的
ArrayList
时,您还需要使用或将ArrayList放入捆绑包中


除此之外,将
ArrayList
作为
public static
始终是一个解决方案,但在面向对象的并行处理中,这不是一个好的解决方案。在内存不足的情况下,它还可以给您
NullPointerException
或丢失数据。

我认为您可以使用oncreate方法初始化适配器,在该方法中,整个适配器都将被删除重新创建,并且在配置更改时也会新创建所有数据。因为您在oncreate方法中初始化数据。请尝试全局维护列表,并在adapter中删除时在活动中删除列表中的项。或者在项目中尝试类似视图模型体系结构的操作。使用
MVVM
模式。它将管理定向状态

MVVM RecyclerView示例:

遵循这一点-我对纵向和横向有不同的UI设计。使用这一点时,当我将屏幕从横向更改为potrait时,横向中的相同UI设计也适用于纵向。如果有帮助,请接受我的回答。或者如果需要进一步帮助,请告诉我。
class MainActivity : AppCompatActivity() {
    private lateinit var mSportsData: ArrayList<ListItem>
    private lateinit var mAdapter: MyAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val gridColumnCount = resources.getInteger(R.integer.grid_column_count)
        recycler_view.layoutManager = GridLayoutManager(this,gridColumnCount)
        mSportsData = ArrayList()
        recycler_view.setHasFixedSize(true)
        initializeData()
        recycler_view.adapter = mAdapter

        var swipeDirs = 0
        if (gridColumnCount <= 1) {
            swipeDirs = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
        }

        val helper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT or ItemTouchHelper.UP or ItemTouchHelper.DOWN,swipeDirs) {
            override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
                val from = viewHolder.adapterPosition
                val to = target.adapterPosition
                Collections.swap(mSportsData,from,to)
                mAdapter.notifyItemMoved(from,to)
                return true
            }
            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                mSportsData.removeAt(viewHolder.adapterPosition)
                mAdapter.notifyItemRemoved(viewHolder.adapterPosition)
            }
        })
        helper.attachToRecyclerView(recycler_view)
    }

    private fun initializeData() {
        val sportsList : Array<String> = resources.getStringArray(R.array.sports_titles)
        Log.d("Printing","$sportsList")
        val sportsInfo : Array<String> = resources.getStringArray(R.array.sports_info)
        val sportsImageResources : TypedArray = resources.obtainTypedArray(R.array.sports_images)

        mSportsData.clear()

        for (i in sportsList.indices-1) {
            Log.d("Printing","${sportsList[i]},${sportsInfo[i]},${sportsImageResources.getResourceId(i,0)}")
            mSportsData.add(ListItem(sportsList[i], sportsInfo[i], sportsImageResources.getResourceId(i, 0)))
        }
        sportsImageResources.recycle()
        mAdapter = MyAdapter(mSportsData,this)
        mAdapter.notifyDataSetChanged()
    }

    fun resetSports(view: View) {
        initializeData()
    }
}
class MyAdapter(var mSportsData: ArrayList<ListItem>, var context: Context) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(LayoutInflater.from(context).inflate(R.layout.wordlist_item,parent,false))
    }

    override fun getItemCount() = mSportsData.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val listItem = mSportsData.get(position)
        holder.bindTo(listItem)
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
        init {
            itemView.setOnClickListener(this)
        }
        override fun onClick(view: View) {
            val currentSport = mSportsData.get(adapterPosition)
            val detailIntent = Intent(context, DetailActivity::class.java)
            detailIntent.putExtra("title", currentSport.title)
            detailIntent.putExtra("image_resource", currentSport.imageResource)
            context.startActivity(detailIntent)
        }
        fun bindTo(currentSport : ListItem){
            itemView.heading_textview.setText(currentSport.title)
            itemView.description_textview.setText(currentSport.info)
            Glide.with(context).load(currentSport.imageResource).into(itemView.image_view)
        }
    }
}
 <activity android:name=".activity.YourActivity"
    android:label="@string/app_name"
    android:configChanges="orientation|screenSize"/>