Android 创建重复视图的控制器

Android 创建重复视图的控制器,android,controller,android-lifecycle,conductor,Android,Controller,Android Lifecycle,Conductor,我有一个应用程序,它有一个 BaseListActivity承载 BaseController->充当ViewPager ListController->ViewPager的选项卡1 FavoriteController->ViewPager的选项卡2 DetailActivity->单击选项卡1上的项目时启动 DetailController->在DetailActivity 所以,编写代码给你一个想法 activity.xml: 基本控制器: } CoinListController: 类

我有一个应用程序,它有一个

BaseListActivity
承载

BaseController
->充当ViewPager

ListController
->ViewPager的选项卡1

FavoriteController
->ViewPager的选项卡2

DetailActivity
->单击选项卡1上的项目时启动

DetailController
->在
DetailActivity

所以,编写代码给你一个想法

activity.xml:

基本控制器:

}

CoinListController:

类CoinListController:BaseMvvmController(),CoinListAdapter
.CoinListListener{
var list:list=emptyList()
var recyclerView:recyclerView?=null
lateinit变量swipeLayout:SwipeRefreshLayout
LazyThreadSafetyMode.NONE的专用val适配器{
CoinListAdapter(applicationContext!!,this)
}
覆盖创建视图(充气机:布局充气机,容器:视图组):视图{
val视图=充气机。充气(R.layout.coin\u list\u控制器,容器,错误)
swipeLayout=view.findViewById(R.id.swipContainer)
recyclerView=view.findViewById(R.id.listRecycler)
recyclerView!!.layoutManager=LinearLayoutManager(活动)
回收视图!!.addItemDecoration(DividerItemDecoration)(活动、,
DividerItemDecoration.垂直)
recyclerView!!.adapter=适配器
recyclerView!!.isNestedScrollingEnabled=false
view.swipcontainer.apply{
此为.setOnRefreshListener{
viewModel.getCoinList()
this.isRefreshing=false
}
}
返回视图
}
覆盖转速表(视图:视图){
超级转速表(视图)
带(视图模型){
if(list.isEmpty()){
getCoinList()
setSearchListener(视图)
}否则{
view.listRecycler.adapter=适配器
adapter.notifyDataSetChanged()
}
}
}
覆盖连接(视图:视图){
super.onDetach(视图)
view.listRecycler.adapter=null
println(“分离”)
}
覆盖包含的乐趣(硬币:CoinListItem){
viewModel.OnInclicked(硬币)
}
覆盖FavoriteClicked上的乐趣(coinFavoriteItem:coinFavoriteItem){
viewModel.onFavoriteClacked()
}
覆盖val viewModel:CoinListViewModel=get().koin.get()
覆盖状态更改(状态:Mvvm.state){
何时(州){
是否收到CoinListContract.State.CoinListReceived->{
列表=state.coins
适配器.附加项(列表)
}
是否单击了CoinListContract.State.CoinItem->{
Snackbar.make(查看!!,“点击硬币项目”,Snackbar.LENGTH\u SHORT)
//router.onActivityStarted()文件
startActivity(CoinDetailActivity.getLaunchIntent(activity!!,state.coin))
}
是否单击了CoinListContract.State.FavoriteClicked->{
Snackbar.make(查看!!,“单击收藏夹按钮”,Snackbar.LENGTH\u SHORT)
}
是CoinListContract.State.QueryRan->{
adapter.addItems(state.searchList)
}
is CoinListContract.State.Error->{
Log.d(“OnStateChange”,state.throwable.localizedMessage!!)
}
}
}
所以问题出在
CoinListController
中,当我单击一个列表项时,
DetailActivity
启动,然后我退出..返回到
CoinListController

但是,对于随后每次单击一个项目,都会添加一个额外的侦听器(我认为)。因此,如果我在第三次单击某个项目时,
CoinListController.OnInclicked
被调用3次,创建了
CoinDetailActivity
的3个实例。因此,我必须向后按3次才能返回到
CoinListController

调试模式下不存在此行为


我正在分离时将适配器设置为null。在控制器的生命周期中,什么是持久的?是我在适配器中设置的侦听器还是其他什么?

CoinListActivity
CoinBaseController
中设置根目录两次导致了问题

<LinearLayout android:id="@+id/mainLayout"
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

<com.bluelinelabs.conductor.ChangeHandlerFrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
class CoinListActivity : AppCompatActivity() {

private lateinit var router: Router

/**
 * Current implementation uses BlueLineLabs Router to navigate between views and handle animations
 */
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_coin_list)

    router = Conductor.attachRouter(this, container, savedInstanceState)

    router.setRoot(RouterTransaction.with(CoinBaseController()))

    RoomSingleton.initDB(this)
.
.
.
class CoinBaseController : Controller() {


override fun onCreateView(inflater: LayoutInflater, container: ViewGroup): View {
    return inflater.inflate(R.layout.coin_base_controller, container, false).apply {
        viewPager.adapter = TabAdapter()
        tabs.setupWithViewPager(viewPager)
    }
}

.
.
.

inner class TabAdapter : RouterPagerAdapter(this) {
    override fun configureRouter(router: Router, position: Int) {
        router.setPopsLastView(true)
        when (position) {
            0 -> router.pushController(RouterTransaction.with(CoinListController.newInstance()))
            1 -> router.pushController(RouterTransaction.with(CoinFavoriteController()))
        }
        if (router.hasRootController().not())
            router.setRoot(RouterTransaction.with(this@CoinBaseController))
    }

    override fun getCount(): Int = 2

    override fun getPageTitle(position: Int): CharSequence? {
        return if (position == 0)
            "List"
        else
            "Favorites"
    }
}
    class CoinListController : BaseMvvmController<CoinListViewModel, CoinListContract.State>(), CoinListAdapter
.CoinListListener {
var list: List<CoinListItem> = emptyList()
var recyclerView: RecyclerView? = null
lateinit var swipeLayout: SwipeRefreshLayout

private val adapter by lazy(LazyThreadSafetyMode.NONE) {
    CoinListAdapter(applicationContext!!, this)
}


override fun onCreateView(inflater: LayoutInflater, container: ViewGroup): View {
    val view = inflater.inflate(R.layout.coin_list_controller, container, false)
    swipeLayout = view.findViewById(R.id.swipeContainer)
    recyclerView = view.findViewById(R.id.listRecycler)
    recyclerView!!.layoutManager = LinearLayoutManager(activity)
    recyclerView!!.addItemDecoration(DividerItemDecoration(activity,
            DividerItemDecoration.VERTICAL))
    recyclerView!!.adapter = adapter
    recyclerView!!.isNestedScrollingEnabled = false
    view.swipeContainer.apply {
        this.setOnRefreshListener {
            viewModel.getCoinList()
            this.isRefreshing = false
        }
    }
    return view
}


override fun onAttach(view: View) {
    super.onAttach(view)
    with(viewModel) {
        if (list.isEmpty()) {
            getCoinList()
            setSearchListener(view)
        } else {
            view.listRecycler.adapter = adapter
            adapter.notifyDataSetChanged()
        }
    }

}

override fun onDetach(view: View) {
    super.onDetach(view)
    view.listRecycler.adapter = null
    println("Detached")
}


override fun onCoinClicked(coin: CoinListItem) {
    viewModel.onCoinClicked(coin)
}

override fun onFavoriteClicked(coinFavoriteItem: CoinFavoriteItem) {
    viewModel.onFavoriteClicked()
}

override val viewModel: CoinListViewModel = get().koin.get()

override fun onStateChange(state: Mvvm.State) {
    when (state) {
        is CoinListContract.State.CoinListReceived -> {
            list = state.coins
            adapter.addItems(list)
        }
        is CoinListContract.State.CoinItemClicked -> {
            Snackbar.make(view!!, "Coin Item Clicked", Snackbar.LENGTH_SHORT)
            //router.onActivityStarted()
            startActivity(CoinDetailActivity.getLaunchIntent(activity!!, state.coin))
        }
        is CoinListContract.State.FavoriteClicked -> {
            Snackbar.make(view!!, "Favorite Button Clicked", Snackbar.LENGTH_SHORT)
        }
        is CoinListContract.State.QueryRan -> {
            adapter.addItems(state.searchList)
        }
        is CoinListContract.State.Error -> {
            Log.d("OnStateChange", state.throwable.localizedMessage!!)
        }
    }
}