如何在使用RxJava接收的ListView上显示数据

如何在使用RxJava接收的ListView上显示数据,java,android,kotlin,rx-java2,Java,Android,Kotlin,Rx Java2,“在这个问题的标签中指出Java,因为Java和Kotlin是兼容的,这里有一个与Java非常相似的示例” 我创建了一个在列表视图中显示数据的程序。我正在学习RxJava2,并决定制作一个示例,其中使用RxJava获得的数据显示在ListView中。下面是ListView适配器的代码 class AdapterListView(ctx: Context, intent: Intent): RemoteViewsService.RemoteViewsFactory { private va

“在这个问题的标签中指出Java,因为Java和Kotlin是兼容的,这里有一个与Java非常相似的示例”

我创建了一个在列表视图中显示数据的程序。我正在学习RxJava2,并决定制作一个示例,其中使用RxJava获得的数据显示在ListView中。下面是ListView适配器的代码

class AdapterListView(ctx: Context, intent: Intent): RemoteViewsService.RemoteViewsFactory {
    private var context: Context? = null
    private var widgetId = 0
    var data: ArrayList<String>? = null

    init {
        context = ctx
        widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
    }

    override fun onCreate() {
        data = ArrayList()
    }

    override fun onDataSetChanged() {
        data!!.clear()
        Observable // There is pseudo observable for example
        .observeOn(SchedulerProvider.ui())
        .subscribe (
                {
                    for(i in it.indices) {
                        Log.e("IT::", it[i])
                        data!!.add(it[i])
                    }
                },
                {
                    data!!.add("ERROR")
                }
            )
            .toString()
    }

    override fun onDestroy() {}

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

    override fun getViewAt(position: Int): RemoteViews {
        val rView = RemoteViews(context!!.packageName, R.layout.list_view)
        rView.setTextViewText(R.id.textView, data!![position])

        return rView
    }

    override fun getLoadingView(): RemoteViews? {
        return null
    }

    override fun getViewTypeCount(): Int {
        return 1
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    override fun hasStableIds(): Boolean {
        return true
    }
}
class AdapterListView(ctx:Context,intent:intent):RemoteViewsService.RemoteViewsFactory{
私有变量上下文:上下文?=null
私有变量widgetId=0
变量数据:ArrayList?=null
初始化{
上下文=ctx
widgetId=intent.getIntExtra(AppWidgetManager.EXTRA\u APPWIDGET\u ID,AppWidgetManager.INVALID\u APPWIDGET\u ID)
}
重写fun onCreate(){
data=ArrayList()
}
重写数据集更改(){
数据!!.clear()
可观察//例如,存在伪可观察
.observeOn(SchedulerProvider.ui())
.订阅(
{
对于(i在it.索引中){
Log.e(“IT::”,IT[i])
数据!!.add(它[i])
}
},
{
数据!!.add(“错误”)
}
)
.toString()
}
重写fun onDestroy(){}
重写fun getCount():Int{
返回数据!!.size
}
覆盖getViewAt(位置:Int):远程视图{
val rView=remoteview(context!!.packageName,R.layout.list\u视图)
rView.setTextViewText(R.id.textView,数据!![position])
返回视图
}
覆盖getLoadingView():远程视图{
返回空
}
重写getViewTypeCount():Int{
返回1
}
覆盖getItemId(位置:Int):长{
返回位置。toLong()
}
重写表ID():布尔值{
返回真值
}
}

使用subscribe,我获取数据并添加到动态数组中。对于Log.e,数据显示在屏幕上,也就是说,没有错误,但它们没有添加到数据中,或者它们被添加到数据中,但由于RxJava异步运行,因此没有数据添加到数据中。想知道是否有方法实现它,以便您可以使用RxJava将数据输出到ListView?

您需要调用adapter notifyDataSetChanged方法来完成这些项loaded@GurgenArustamyan但在我的示例中,适配器类继承自RemoteViewsService.RemoteViewsFactory,而不是BaseAdapter,由于我在小部件中显示ListView,因此不会为我调用notifyDataSetChanged方法,或者我不知道在这种情况下如何正确调用。在我看来,您没有调用notifyAppWidgetViewDataChanged。如果数据已更改,则需要通知小部件集合视图需要更新。