我想将上次单击的按钮(回收器视图的状态)保存在共享首选项中



我正在创建一个新闻应用程序,我有一个带有新闻类别名称的按钮的回收器视图。我想在销毁应用程序后保存回收商视图的状态。例如,如果我点击"运动类别",在我销毁应用程序并重新打开它之后,应用程序应该选择了运动类别。该代码没有错误,但它没有保存状态。它写在片段中的代码

我的一些代码


var isFilterFromCategories = false
class HomeFragment : Fragment(), Callback, HomePageAdapter.Listener,CategoryListener {

private lateinit var binding : FragmentHomeBinding
private lateinit var adapter: HomePageAdapter
private lateinit var menuAdapter: MenuAdapter
private lateinit var currentCategory : String
private val viewModel by activityViewModels<ArticleViewModel>()
private var lastPosition : Int = 0
private var firstTime = true
private fun showPopUp(view: View) {
val popup = PopupMenu(context, view, Gravity.RIGHT)
popup.inflate(R.menu.content_of_dropdown_menu)
popup.setOnMenuItemClickListener(PopupMenu.OnMenuItemClickListener { item: MenuItem? ->
when (item!!.itemId) {
R.id.dm_raportimi -> {
reportArticle()
}
}
true
})
popup.show()
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_home, container, false)
val window = requireActivity().window
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.statusBarColor = Color.BLACK

return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val snapHelper = PagerSnapHelper()
snapHelper.attachToRecyclerView(binding.recyclerView)
setDrawerOpeningFunctionality()

initRecyclerView()
initMenuRecyclerView()
viewModel.initializeList()
val pref = requireActivity()!!.getPreferences(Context.MODE_PRIVATE)
lastPosition = pref.getInt("lastpos",0)
topMenuRecyclerView.scrollToPosition(lastPosition)
topMenuRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
lastPosition =
(topMenuRecyclerView.layoutManager as LinearLayoutManager?)!!.findFirstVisibleItemPosition()
}
})

viewModel.getArrayList().observe(requireActivity()){
adapter.setArticles(it)
}
}
override fun onDestroy() {
super.onDestroy()
//save position in Shared Preferences
val pref = requireActivity()!!.getPreferences(Context.MODE_PRIVATE)
val e = pref.edit()
e.putInt("lastpos",lastPosition)
Log.d("lololo",lastPosition.toString())
e.apply()
}
override fun onResume() {
super.onResume()
if (isFilterFromCategories) {
isFilterFromCategories = false
setUpComingFromCategorySelection()
}
}
private fun initRecyclerView(){
adapter = HomePageAdapter(requireContext(), this)
binding.recyclerView.adapter = adapter
}
private fun initMenuRecyclerView(){
menuAdapter = MenuAdapter(requireContext(),this)
binding.topMenuRecyclerView.apply {
adapter = menuAdapter
}
}
private fun openWebLink(url: String){
val webIntent: Intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(webIntent)
}
private fun shareLink(title: String, url: String){
val sharingIntent = Intent.createChooser(Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/")
putExtra(Intent.EXTRA_SUBJECT,url)
// (Optional) Here we're setting the title of the content
putExtra(Intent.EXTRA_TITLE, title)
// (Optional) Here we're passing a content URI to an image to be displayed
type = "rext/plain"
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
}, null)
startActivity(sharingIntent)
}
override fun sourceOfInformationClicked(link: String) {
openWebLink(link)
}
override fun shareLinkInformationClicked(name:String, link:String){
shareLink(name,link)
}
override fun showMoreOnClicked(view: View){
showPopUp(view)
}
private fun reportArticle() {
val action = HomeFragmentDirections.actionHomeFragmentToReportFragment()
findNavController().navigate(action)
}
private fun setDrawerOpeningFunctionality() {
val drawerLayout = requireActivity().findViewById<DrawerLayout>(R.id.drawer_layout)
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
binding.btnNavDraw.setOnClickListener {
with(drawerLayout){
if (!isDrawerOpen(GravityCompat.END)){
openDrawer(GravityCompat.END)
} else {
closeDrawer(GravityCompat.END)
}
}
}
}
override fun changeCategory(category: String){
viewModel.setNews(category)
binding.topMenuRecyclerView.adapter?.notifyDataSetChanged()
}
override fun selectCategoryListener(category: String, pos: Int) {
TODO("Not yet implemented")
}
private fun setUpComingFromCategorySelection(){
val args: HomeFragmentArgs by navArgs()
currentCategory = args.category
menuAdapter.setCategory(currentCategory)
menuAdapter.selected.add(args.position)
binding.topMenuRecyclerView.scrollToPosition(args.position)
viewModel.setNews(currentCategory)
}
}

您应该在项目点击时保存位置。不要在onDestroy 上保存位置

private const val TAG = "DeviceAdapter"
class DeviceAdapter(
private val context: Context
, private val list: MutableList<UsbDevice>
, private val callback: (device: UsbDevice) -> Unit): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(context)
val binding = ItemDeviceBinding.inflate(inflater,parent,false)
return MyViewHolder(binding)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val device = list[position]
if (holder is MyViewHolder){
holder.binding.textHere.text = device.deviceName
holder.binding.textHere.setOnClickListener {
val pref = context.getSharedPreferences("SHARED_PREFERENCES_KEY",
Context.MODE_PRIVATE)
val editor = pref.edit()
editor.putInt("lastPos",position)
editor.apply()

}
}
}
override fun getItemCount(): Int {
return list.size
}
class MyViewHolder(val binding: ItemDeviceBinding): RecyclerView.ViewHolder(binding.root)

}

最新更新