处理Fragment中所有类型响应的通用方法



我创建了一个通用片段类来处理来自服务器的所有类型的响应。我想做一些DataTableProvider<>可以处理任何类型的响应。

我该如何做到这一点。

class TestFragmentActivity : AppCompatActivity(), DataTableProvider<Any> {
protected val mTabPatientsFragment = TabPatientsFragment()
protected val mTabObservationsFragment = TabObservationsFragment()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test_fragment)
replaceFragment()
}
private fun replaceFragment(){
supportFragmentManager.beginTransaction().replace(R.id.frame_container,
mTabPatientsFragment).commit()
}
override fun getDataTableListener(mTableFragment: DataTableFragment<Any>): DataTableListener<Any> {
val dataTableId = mTableFragment.dataTableId
if (dataTableId.equals("observations"))
return mTabObservationsFragment
else return mTabPatientsFragment
}
override fun getDataTableConfig(mTableFragment: DataTableFragment<Any>): DataTableConfig {
val dataTableId = mTableFragment.dataTableId
val config = DataTableConfig()
config.noRecordCell = R.layout.cell_no_record
config.showSearch = false
config.showAddButton = false
if (dataTableId.equals("observations"))
{
config.cellResourceId = R.layout.home_observation_cell
} else config.cellResourceId = R.layout.home_patient_cell
return config
}
}

上述片段中的getDataTableListener回调出现错误所需类型不匹配DataTableListener找到TabObservationFragment

TabObservationFragment

class TabObservationFragment : AppBaseFragment(),DataTableListener<Observation>

选项卡PatientFragment

class TabPatientFragment : AppBaseFragment(),DataTableListener<Patient>

我怎么能将它设置为适用于所有类型的响应呢。

我尝试了DataTableListener<>但无法实现

错误状态

投影不允许用于超类型的即时参数

我如何使用DataTableProvider<>适用于所有类型的响应

编辑

我在TestFragmentActivity中有几个带有fragmentViewpager的片段。

我有一个结构可以帮助实现分页、搜索和实现片段中的所有内容。但根据该结构,DataTableProvider必须在活动中处理,并根据tableId I更新了getDataTableListenergetDataTableListener的回调

上述回调应该返回某种类型的

有没有办法实现下面这样的回调

override fun getDataTableConfig(mTableFragment: DataTableFragment<*>?): DataTableConfig?
override fun getDataTableListener(mTableFragment: DataTableFragment<*>?): DataTableListener<*>?

快速回答,使用"out";修改器:

fun getDataTableListener(mTableFragment: DataTableFragment<Any>): DataTableListener<out Any>

长答案:

你要寻找的是方差,你可以在官方的kotlin文档中阅读:https://kotlinlang.org/docs/reference/generics.html

因为例如List界面看起来像这样:

public interface List<out E>

你可以这样做分配:

val list: List<Any> = listOf(1,2,3)

但这是不可能做到的:

val mutableList : MutableList<Any> = listOf(1,2,3)

因为MutableList没有";out";修饰符。这是有道理的,因为MutableList可以更改为MutableList,您可以添加例如String,但它已经指向List。

在你的例子中,你可以使用";out";修饰符,如果并且仅当,您的DataTableListener不使用泛型类型作为输入。例如:

interface DataTableListener<T>{
fun assignValue(t:T)
fun getValue():T
}

有了上面这样的界面,您仍然可以使用";out";修饰符,但您将无法执行";assignValue";作用

整个示例:

class Patient
class Observation
class DataTableFragment<T>
interface DataTableListener<T> {
fun assignValue(t: T)
fun getValue(): T
}
class TabObservationFragment : DataTableListener<Observation> {
override fun getValue(): Observation {
TODO("Not yet implemented")
}
override fun assignValue(t: Observation) {
TODO("Not yet implemented")
}
}
class TabPatientFragment : DataTableListener<Patient> {
override fun getValue(): Patient {
}
override fun assignValue(t: Patient) {
TODO("Not yet implemented")
}
}
val mTabObservationsFragment = TabObservationFragment()
val mTabPatientsFragment = TabPatientFragment()
fun getDataTableListener(mTableFragment: DataTableFragment<Any>): DataTableListener<out Any> {
val test = "observations"
if (test == "observations")
return mTabObservationsFragment
else return mTabPatientsFragment
}
fun getIt() {
val listener = getDataTableListener(DataTableFragment())
listener.assignValue("test")
}

最新更新