gpt4 book ai didi

android - 在方向更改期间保存 Recycler View 的实例

转载 作者:行者123 更新时间:2023-11-29 23:02:10 25 4
gpt4 key购买 nike

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

每个 recyclerview 都有一个卡片 View 。每个 CardView 包含每个 ListItem。我从那个 RecyclerView 中删除了一个 CardView

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

ListItem 类:

class ListItem(var title: String, var info: String,  val imageResource: Int) { 

}

MainActivity 类:

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()
}
}

MyAdapter 类:

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)
}
}
}

最佳答案

如果纵向和横向模式的布局相同,则可以在 list 中限制 Activity 重新启动。

将此添加到 list 中的 Activity 中。

 <activity android:name=".activity.YourActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize"/>

如果您不想限制屏幕方向更改,则可以使用 OnSaveInstanceState 方法在方向更改时保存旧数据。无论您通过此方法保存什么数据,您都将在 bundle 中的 OnCreate 方法中收到它。这是帮助 link .所以这里因为你有你自己的类类型的 ArrayList 你还需要使用 SerializableParcelable将 ArrayList 放入 Bundle 中。

除了将 ArrayList 设置为 public static 始终是一个解决方案,但在面向对象的参数化时间中它不是一个好的解决方案。在内存不足的情况下,它还会给您 NullPointerException 或数据丢失。

关于android - 在方向更改期间保存 Recycler View 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56846636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com