Как обновить мой Recyclerview с помощью kotlin android? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть акт с Recyclerview, который отображает данные. Теперь я хочу обновить свой RecyclerView после получения новых данных. На данный момент каждый раз, когда я закрываю и снова открываю свое приложение, новые данные будут отображаться. но я хочу, чтобы он не закрывал, чтобы обновить мой взгляд.

Я пробовал это,

но ничего не получится,

fun setupViewPager(viewPager: ViewPager, it: List<TransactionEntity>, incoming: TransactionAdapterDirection, mainActivity: MainActivity) {

        val cc: Context = mainActivity.applicationContext

        if(adapter.count < 2) {
            if (incoming.equals(OUTGOING)) {
                val gson = Gson()
                val gson1 = GsonBuilder().create()
                val model = it
                val IT = gson.toJson(model)

                val pref = cc.applicationContext.getSharedPreferences("MyPrefSend", 0)
                val editor = pref.edit()
                editor.putString("NEWIT_SEND", IT)
                editor.apply()

                adapter.addFragment(SendingFragment(),"SEND")
                adapter.notifyDataSetChanged()
            } else if (incoming.equals(INCOMING)) {
                val gson = Gson()
                val gson1 = GsonBuilder().create()
                val model = it
                val IT = gson.toJson(model)

                val pref = cc.applicationContext.getSharedPreferences("MyPrefRec", 0)
                val editor = pref.edit()
                editor.putString("NEWIT_REC", IT)
                editor.apply()
                adapter.addFragment(ReceiveFragment(), "RECEIVE")
                adapter.notifyDataSetChanged()
            }
            viewPager.adapter = adapter
        }
    }


class ViewPagerAdapter(manager: FragmentManager) : FragmentStatePagerAdapter(manager)
    {
        private val mFragmentList: ArrayList<Fragment> = ArrayList<Fragment>()
        private val mFragmentTitleList: ArrayList<String>  = ArrayList<String>()

        override fun getCount(): Int {
            return mFragmentList.size
        }


        override fun getItem(position: Int): Fragment? {
            var fragment: Fragment? = null
            if (position == 0) {
                fragment = SendingFragment()
            } else if (position == 1) {
                fragment = ReceiveFragment()
            }
            return fragment
        }


        fun addFragment(fragment: Fragment, title: String) {
            mFragmentList.add(fragment)
            mFragmentTitleList.add(title)
        }

        override fun getPageTitle(position: Int): CharSequence? {
            return mFragmentTitleList[position]
        }

        override fun getItemPosition(fragItem: Any): Int {
            var position = 0
            if (fragItem is ReceiveFragment) {
                position = 0
            } else if (fragItem is SendingFragment) {
                position = 1
            }
            return if (position >= 0) position else PagerAdapter.POSITION_NONE
        }
    }

**Framgnet.kt**





class ReceiveFragment: Fragment()
    {

        private var linearLayoutManager: LinearLayoutManager? = null

        fun fromJson(jsonString: String, type: Type): Any {
            return Gson().fromJson(jsonString, type)
        }

        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

            val pref = context!!.getSharedPreferences("MyPrefRec", 0)
            val mFragIT = pref.getString("NEWIT_REC", "")

            val NewIT = fromJson(mFragIT,
                    object : TypeToken<List<TransactionEntity>>() {

                    }.type) as List<TransactionEntity>

            val activity = activity  as MainActivity
            val myAppDatabaseData = activity.getAppDatabaseData()
            val myNetwrk = activity.getNwtwrkData()

            // Inflate the layout for this fragment
            val rootView = inflater.inflate(R.layout.receive_fragment, container, false)
            val recyclerView = rootView.findViewById<RecyclerView>(R.id.transaction_recycler_in) as RecyclerView
            linearLayoutManager = LinearLayoutManager(activity, LinearLayout.VERTICAL, false)
            recyclerView.layoutManager = linearLayoutManager
            recyclerView.adapter = TransactionRecyclerAdapter(NewIT,myAppDatabaseData,TransactionAdapterDirection.INCOMING,myNetwrk)
            recyclerView.setHasFixedSize(true)
            return rootView
        }

    }

Я пробовал это, mAdapter.notifyDataSetChanged ();

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

Вы должны попробовать LiveData

LiveData - это класс держателя данных, который можно наблюдать в пределах заданного жизненный цикл. Это означает, что Наблюдатель может быть добавлен в паре с LifecycleOwner, и этот наблюдатель будет уведомлен о модификациях обернутых данных, только если активен сопряженный LifecycleOwner состояние.

Документация: https://developer.android.com/reference/android/arch/lifecycle/LiveData

0 голосов
/ 26 октября 2018

Если вы хотите обновить данные из действия / фрагмента, вы можете сделать одну функцию внутри адаптера, как показано ниже:

 public void update(ArrayList<String> modelList){
        //string arraylist is for example pass your data
        // replace your adapter data with argument data
       mAdapter.notifyDataSetChanged();
    }

Для котлин:

fun update(modelList:ArrayList<String){
   myList = modelList
   myAdapter!!.notifyDataSetChanged()
}

Вызовите эту функцию из действия / фрагмента, как показано ниже:

 mAdapter.update(response.getList());
0 голосов
/ 26 октября 2018

Если вы хотите сделать больше в стиле Kotlin, сделайте так:

1) Создайте абстрактный класс для Adapter:

 abstract class BaseRecyclerAdapter<Type, ViewHolder : BaseViewHolder<Type>>(list: List<Type> = mutableListOf()) : RecyclerView.Adapter<ViewHolder>() {

   var items: MutableList<Type> = list.toMutableList()
        set(value) {
            field = value
            notifyDataSetChanged()
        }

    override fun getItemCount() = items.size
    enter code here
    override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(items[position]) }

2) Создайте абстрактный класс для ViewHolder:

 abstract class BaseViewHolder<in T>(override val containerView: View): RecyclerView.ViewHolder(containerView), LayoutContainer {

    abstract fun bind(item: T) }

3) Как использовать:

class MyActivity : AppCompatActivity() { private var adapter: MyAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
        //This is your data which you set first time
        val initData = mutableListOf<String>()
        adapter = MyAdapter(initData)
        myRecyclerView.layoutManager = adapter
        myRecyclerView.layoutManager = LinearLayoutManager(this)
    }
    // Call this function when you need to update adapter
    private fun notifyAdapter(list: MutableList<String>){
        adapter.items = list 
    }}

Создать MyAdapter:

 private class MyAdapter(list: MutableList<String>) : BaseRecyclerAdapter<String, ViewHolder>(list) {

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder.newInstance(parent)

    }

Создать ViewHolder для MyAdapter:

private class ViewHolder(containerView: View) : BaseViewHolder<String>(containerView) {

    companion object {
        fun newInstance(parent: ViewGroup) = ViewHolder(parent.inflate(R.layout.item))
    }

    override fun bind(item: String) {
        title.text = item
    }}

Создать элемент для ViewHolder:

  <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/title"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

        </LinearLayout>

Если у вас есть какие-либо вопросы, пожалуйста, задавайте

0 голосов
/ 26 октября 2018

Вы можете сделать это с помощью функции в вашем ItemAdapter:

/**
 * Refresh the whole data set of items.
 */
fun refreshDataset() {
    mDataset = parseItems(mAppCtx)
    notifyDataSetChanged()
}

, а затем, всякий раз, когда вы получаете новый набор данных, вы можете напрямую вызывать такую ​​функцию.

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