Обновление списка адаптеров из другого класса - PullRequest
0 голосов
/ 16 мая 2018

Я разрабатываю свое первое приложение в kotlin, и я столкнулся со следующей проблемой:

В моей деятельности есть "RecyclerView" с методом его обновления

class GroupsActivity : AppCompatActivity() {

val TAG = "GroupsActivity"


companion object {
    var active: Boolean = false

    var tableModel: List<GroupModel>? = null

}

fun updateList() {

    rv_list.adapter = GroupsListAdapter(this, tableModel)

}

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

    if (WebSocketConnection.connected) {
        print(1)
    }

    rv_list.layoutManager = LinearLayoutManager(this)

    rv_list.hasFixedSize()

    rv_list.adapter = GroupsListAdapter(this, tableModel)


}
}

Список будет обновляться асинхронно из другого класса в любое время. Это метод:

fun jsonActionCheck(action : String, jsonString: String){

    val gson = Gson()

    when (action){
        "LOGIN_OK" -> {}
        "LOGOUT" -> {}
        "GET_GROUPS" -> {

            val jsonModel : JsonGroups = gson.fromJson(jsonString, JsonGroups::class.java)

            if(GroupsActivity.active){

                GroupsActivity.tableModel = jsonModel.data

                GroupsActivity.updateList()
            }
        }
        "GET_CHAT_LIST" -> {}
        "SEND_MESSAGE" -> {
            //var grp = model.data.get(0).group
            //var msg = model.data.get(0).message
        }
        "GET_MESSAGE" -> {}
        else -> {}
    }
}

Я знаю, что метод не является статичным, поскольку находится вне объекта-компаньона, но изнутри я не могу ссылаться на список.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Интерфейс

Написать интерфейс и реализовать его в GroupsActivity Как то так

/**
 * View Call Back interface for Activity
 */
interface ViewCallBackOperations : BaseViewOpration {

    fun onDataReceived(randomDialog: List<MovieModel>)

    fun onError(error: String)
}

Реализован интерфейс в Activity и переопределить метод обратного вызова, что-то вроде этого

class PopularFragment : Activity(), PopularMVPContract.ViewCallBackOperations,

Метод переопределения для интерфейса, эти методы будут вызываться асинхронно из другого класса, когда я получаю данные из Интернета из Web API для моего приложения

    override fun onDataReceived(randomDialog: List<MovieModel>) {
    adapter!!.updateData(randomDialog)
}

override fun onError(error: String) {
    this.showSnackBar("Oops !! Something went wrong please try again !!")
}

Другой класс

Это еще один класс, откуда эти методы называются

    private fun handlePopularResponse(data: JSONObject?, error: String?) {
    if (null == error && null != mViewCallBack) {
        val gson = Gson()
        val recentMoviesResponse: RecentAPIResponse = gson.fromJson(data.toString(), RecentAPIResponse::class.java)
        mViewCallBack!!.get()!!.onDataReceived(recentMoviesResponse.data)
    } else if (null != mViewCallBack){
        mViewCallBack!!.get()!!.onError(error!!)
    }
}

mViewCallBack - что это?

Это не что иное, как объект со слабой ссылкой, инициализированный с помощью конструктора, что-то вроде этого

private var mViewCallBack: WeakReference<PopularMVPContract.ViewCallBackOperations>? = null

init {
    mViewCallBack = WeakReference(viewCallBackOperations)
}

Адаптер класса

Объявление объекта списка:

private var movieList: MutableList<MovieModel> = mutableListOf<MovieModel>()

Добавить метод в класс адаптера следующим образом

 fun updateData(data: List<MovieModel>) {
    movieList.clear()
    movieList.addAll(data)
    notifyDataSetChanged()
}
0 голосов
/ 16 мая 2018

Вы можете достичь желаемого, выполнив следующие действия:

-take list from adapter object. ( e.g. adapterObj.list)
-clear list. (e.g. adapterObj.list.clear)
-add new list in adapter list. (e.g. adapterObj.list.addAll(newlistObj))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...