Сохранить / восстановить состояние фрагмента с помощью RecyclerView в Android - PullRequest
0 голосов
/ 07 декабря 2018

Я создал приложение для Android, которое подключается к GitHub API и показывает список репозиториев определенного пользователя.Список отображается recyclerView.Я пытаюсь сохранить и восстановить список, когда я переключаю фрагменты.Я попытался сохранить список в переменную и добавить это в recyclerView.Но это не работает.

Мой фрагмент:

class MainFragment : Fragment() {

lateinit var recyclerView: RecyclerView
var responseSave:List<GitHubPOJO> = ArrayList()
var posts: MutableList<GitHubPOJO> = ArrayList()
lateinit var btn:Button

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_main, container, false)
    btn = view.findViewById(R.id.button)
    btn.setOnClickListener {
        posts = ArrayList()

        val name:String = view!!.findViewById<EditText>(R.id.editText).text.toString()
        recyclerView = view!!.findViewById(R.id.posts_recycle_view)
        val layoutManager = LinearLayoutManager(this.activity!!)
        recyclerView.layoutManager = layoutManager

        val adapter = PostsAdapter(posts)
        recyclerView.adapter = adapter
        //HIDE KEYBOARD
        val inputMethodManager = this.activity!!.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        if(activity!!.currentFocus !=null) {
            inputMethodManager.hideSoftInputFromWindow(this.activity!!.currentFocus!!.windowToken, 0)
        }
        val service = Retrofit.Builder()
            .baseUrl("https://api.github.com/") // CHANGE API
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(GitHubService::class.java)
        service.retrieveRepositories(name)
            .enqueue(object : Callback<List<GitHubPOJO>> {
                override fun onResponse(call: Call<List<GitHubPOJO>>, response: Response<List<GitHubPOJO>>) {
                    responseSave = response.body()!!
                    posts.addAll(responseSave)
                    response.body()?.forEach { println ("TAG_: $it")}
                    recyclerView.adapter?.notifyDataSetChanged()
                }

                override fun onFailure(call: Call<List<GitHubPOJO>>, t: Throwable) {
                    //Toast.makeText(this@MainFragment, "Error occurred while networking", Toast.LENGTH_SHORT).show()
                }
            })
        recyclerView.addOnItemTouchListener(
            ClickListener(this.activity!!, recyclerView, object : ClickListener.OnItemClickListener {
                override fun onLongItemClick(view: View?, position: Int) {
                }

                override fun onItemClick(view: View, position: Int) {
                    val url = posts!![position].htmlUrl
                    println("URL =  $url")
                    view.findNavController().navigate(MainFragmentDirections.actionMainFragmentToWebFragment(url))


                }
            })
        )
    }
    return view
}

И есть мой код onResume:

override fun onResume() {
    super.onResume()
    val adapter = PostsAdapter()
    adapter.updateAdapterList(responseSave.toMutableList())
    println("RESUME")
    println(responseSave)
}

Когда я печатаю ответ Сохранить, я вижу, что мой список там.Но он не отображается в RecyclerView.

Фрагменты отбрасываются стандартной библиотекой навигации.

Код активности:

class MainActivity : AppCompatActivity(){

private lateinit var navController: NavController
private lateinit var mNavView:NavigationView
private lateinit var mDrawerLayout:DrawerLayout



override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    mDrawerLayout = findViewById(R.id.drawer_layout)
    mNavView = findViewById(R.id.nav_view)

    navController = this.findNavController(R.id.myNavHostFragment)
    NavigationUI.setupActionBarWithNavController(this, navController,mDrawerLayout)
    NavigationUI.setupWithNavController(mNavView, navController)
}

override fun onSupportNavigateUp(): Boolean {
    val navController = this.findNavController(R.id.myNavHostFragment)
    return NavigationUI.navigateUp(mDrawerLayout,navController)
}}

My Код адаптера RecyclerView :

class PostsAdapter(private var posts: MutableList<GitHubPOJO>? = ArrayList()) : RecyclerView.Adapter<PostsAdapter.ViewHolder>() {

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

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val post = posts!![position]
        holder.post.text = post.name
    holder.site.text = post.fullName     // Change what you wanna see
}
fun updateAdapterList(newList: MutableList<GitHubPOJO>) {
    posts!!.clear()
    posts!!.addAll(newList)
    notifyDataSetChanged()
}

override fun getItemCount(): Int {
    return posts?.size ?: 0
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var post: TextView = itemView.findViewById<View>(R.id.postitem_post) as TextView
    var site: TextView = itemView.findViewById<View>(R.id.postitem_site) as TextView
}}

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Добавьте метод в вашем адаптере, который будет выглядеть примерно так:

fun updateAdapterList(newList: MutableList<GitHubPOJO>) {
    oldList.clear()
    oldList.addAll(newList)
    notifyDataSetChanged()
}

Затем вызовите его в вашем onResume() и передайте в ваш обновленный список

0 голосов
/ 08 декабря 2018

Проблема в вашем методе onResume.Вы не добавляете адаптер и LayoutManager в RecylerView, поэтому он не может отображать данные.Попробуйте переместить код инициализации RecylerView из onClickListener в ваш метод onResume:

 recyclerView = view!!.findViewById(R.id.posts_recycle_view)
 val layoutManager = LinearLayoutManager(this.activity!!)
 recyclerView.layoutManager = layoutManager
 val adapter = PostsAdapter(posts)
 recyclerView.adapter = adapter    

Хотя этот код инициализации в вашем методе onCreateView будет лучше, поскольку это первый метод жизненного цикла, вызываемый, когда фрагмент возвращается в вид спередисо спины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...