Действия Android для фрагментирования: замена «this» на getActivity () выдает ошибку: ClassCastException - PullRequest
0 голосов
/ 27 марта 2019

Я пытался создать 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) 

1 Ответ

0 голосов
/ 27 марта 2019

Это потому, что вы ожидаете TaskRowListener внутри вашего TaskAdapter класса:

class TaskAdapter(context: Context, taskList: MutableList<Task>) : BaseAdapter() {

    ..
     // here you're expecting a TaskRowListener
     var _rowListener: TaskRowListener = context as TaskRowListener

.........
}

но ваша активность не TaskRowListener. Итак, вам нужно изменить свою деятельность для реализации TaskRowListener примерно так:

class ToDoActivity : FragmentActivity(), TaskRowListener {
  ...
}

Хотя я думаю, что вам вообще не следует использовать активность, чтобы Адаптер обрабатывался только TodoFragment и продолжал использовать:

_adapter = TaskAdapter(this, _taskList!!)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...