Связывание с данными как по активности, так и по переработке - PullRequest
0 голосов
/ 30 марта 2020

Я хочу связать данные как с деятельностью, так и с обзором переработчика. Но я получаю эту ошибку для представления переработчика. E / RecyclerView: адаптер не подключен; Пропуск макета

Сняв код для привязки данных активности, перезапускает обзор.

Activity.kt

class MainActivity : AppCompatActivity(), IActivity {


    private lateinit var mIMainPresenter: IPresenter
    private lateinit var mMainAdapter: MainAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mIMainPresenter = MainPresenter(this)
        mIMainPresenter.getList()
    }

    /**
     * setup UI widgets
     */
    private fun setupList() {
        val mLayoutManager = LinearLayoutManager(this)
        mMainAdapter = MainAdapter(mIMainPresenter)
        recyclerList.layoutManager = mLayoutManager
        recyclerList.adapter = mMainAdapter
        recyclerList.addItemDecoration(DividerItemDecoration(this, VERTICAL))
        refresh_layout.setOnRefreshListener {
            fetch(null)
            refresh_layout.isRefreshing = false
        }
    }

    /**
     * fetches list from
     */
    override fun fetch(view: View?) {
        mIMainPresenter.getList()
    }

    /**
     * sets the list items once data is fetched from network/database
     */
    override fun setEvents(result: List<Events>) {
        setupList()
        mMainAdapter.setList(result)
        mMainAdapter.notifyDataSetChanged()
    }

    override fun setPrompts(result: List<Prompts>) {
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(
               this, R.layout.activity_main)
        binding.prompt = result[0]
    }

}

Adapter.kt

class MainAdapter(private val mIClick: IClick) : RecyclerView.Adapter<MainAdapter.AutoViewHolder>() {

    private var events: List<Events> = listOf()


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AutoViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val binding = DataBindingUtil.inflate<ListMainBinding>(inflater, R.layout.list_main, parent, false)
        return AutoViewHolder(binding)

    }

    override fun onBindViewHolder(holder: AutoViewHolder, position: Int) {
        val event = events.get(position)
        val binding = holder.listMainBinding;
        binding?.events = event
        binding?.iClick = mIClick
        binding?.executePendingBindings()

    }

    override fun getItemCount(): Int {
        return events.size
    }

    fun setList(result: List<Events>) {
        events = result
    }

    inner class AutoViewHolder : RecyclerView.ViewHolder {
        var listMainBinding: ListMainBinding? = null

        constructor(binding: ListMainBinding?) : super(binding?.root) {
            listMainBinding = binding
        }

    }
}

1 Ответ

0 голосов
/ 30 марта 2020

Если setPrompts вызывается после setEvents, я почти уверен, что он создаст новый RecyclerView, и setupList не будет вызываться после создания этого нового представления переработчика. Это означает, что у нового рециркулятора не будет адаптера.

Вместо этого вы захотите сделать setContentView внутри onCreate, сохранить ссылку на Binding, а затем установить подсказку для этой привязки, когда вы получить данные из БД или сети. Вы, вероятно, также захотите сделать то же самое с setEvents, переместить начальную настройку списка в onCreate и просто изменить данные, когда они появятся.

...