Я пытался создать Todo-приложение, следуя инструкциям.Приложение работает.Но теперь я хочу расширить учебник и преобразовать MainActivity во фрагмент, который вызывается в MainActivity (ToDoActivity).Я прочитал, что фрагмент не имеет контекста, поэтому следует использовать контекст MainActivity.Поэтому я изменил this
на getActivity()
во фрагменте.
Контекст передается классу TaskAdapter, который является пользовательским BaseAdapter ().TaskAdapter создает интерфейс TaskRowListener вне контекста.Это работало с действием, но преобразованное во фрагмент выдает ошибку «ToDoActivity» не может быть приведено к «TaskAdapter $ TaskRowListener»
Ошибка возникает во фрагменте здесь:
_adapter = TaskAdapter(getActivity(), _taskList!!)
и здесь в адаптере: var _rowListener: TaskRowListener = context as TaskRowListener
Если я печатаю this
в исходном коде, результат будет: com.Info_DH.sgru_rchr.UniversityGoesAgile.ToDoActivity@cbaaca4
Если я печатаю getActivity()
в преобразованном фрагментерезультат: com.Info_DH.sgru_rchr.UniversityGoesAgile.ToDoActivity@8aa307d
Так что я еще больше запутался, почему это не работает.Я был бы очень признателен, если бы кто-то знал, в чем может быть проблема.
Main (ToDoActivity):
class ToDoActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main_test)
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.add(R.id.canvas, Todofragment.newInstance(), "Test")
.commit()
}
Фрагмент:
class Todofragment : Fragment(), TaskRowListener {
var _taskList: MutableList<Task>? = null
lateinit var _adapter: TaskAdapter
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
super.onCreate(savedInstanceState)
_taskList = mutableListOf<Task>()
_adapter = TaskAdapter(getActivity(), _taskList!!)
..............
}
TaskAdapter:
class TaskAdapter(context: Context, taskList: MutableList<Task>) : BaseAdapter() {
private val _inflater: LayoutInflater = LayoutInflater.from(context)
private var _taskList = taskList
var _rowListener: TaskRowListener = context as TaskRowListener
.........
}
TaskRowListener:
interface TaskRowListener {
fun onTaskChange(objectId: String, isDone: Boolean)
fun onTaskDelete(objectId: String)
fun onTaskEdit(objectId: String, taskDesc:String)
}
Журнал:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.Info_DH.sgru_rchr.UniversityGoesAgile, PID: 14117
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Info_DH.sgru_rchr.UniversityGoesAgile/com.Info_DH.sgru_rchr.UniversityGoesAgile.ToDoActivity}: java.lang.ClassCastException: com.Info_DH.sgru_rchr.UniversityGoesAgile.ToDoActivity cannot be cast to com.Info_DH.sgru_rchr.UniversityGoesAgile.TaskAdapter$TaskRowListener
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.ClassCastException: com.Info_DH.sgru_rchr.UniversityGoesAgile.ToDoActivity cannot be cast to com.Info_DH.sgru_rchr.UniversityGoesAgile.TaskAdapter$TaskRowListener
at com.Info_DH.sgru_rchr.UniversityGoesAgile.TaskAdapter.<init>(TaskAdapter.kt:19)
at com.Info_DH.sgru_rchr.UniversityGoesAgile.Todofragment.onCreate(Todofragment.kt:89)
at android.support.v4.app.Fragment.performCreate(Fragment.java:2339)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1377)
at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1109)
at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:996)
at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:99)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2364)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3221)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3171)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:560)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)
at android.app.Activity.performStart(Activity.java:6679)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)