将View.getContext()强制转换为androidx.appcompat.app.AppCompatActivity时的ClassCastException

将View.getContext()强制转换为androidx.appcompat.app.AppCompatActivity时的ClassCastException,android,android-fragments,classcastexception,androidx,fragmentmanager,Android,Android Fragments,Classcastexception,Androidx,Fragmentmanager,当我试图从适配器启动一个片段时,我得到了这个异常 我寻找了类似的问题,但对androidX的转换相对较新,所以我找不到相关的解决方案。 我找到了一个解决方案,可以在创建适配器对象时将FragmentManager传递给构造函数。这还需要初始化碎片管理器,这就是我再次陷入困境的地方 该过程的代码为: AppCompatActivity activity = (AppCompatActivity) v.getContext(); int id = currentCountry.getId()

当我试图从适配器启动一个片段时,我得到了这个异常

我寻找了类似的问题,但对androidX的转换相对较新,所以我找不到相关的解决方案。 我找到了一个解决方案,可以在创建适配器对象时将FragmentManager传递给构造函数。这还需要初始化碎片管理器,这就是我再次陷入困境的地方

该过程的代码为:

AppCompatActivity activity = (AppCompatActivity) v.getContext();
    int id = currentCountry.getId();

    Fragment mdf = new DetailsFragment();

    activity.getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.fragments_container, mdf)
            .addToBackStack(null)
            .commit();
异常消息是

java.lang.ClassCastException:android.app.Application不能强制转换为androidx.appcompat.app.AppCompatActivity。

有什么解决办法吗?也许最后一个选择是从androidX恢复到android


是否还需要其他代码来解决这个问题?

我认为它在我看来是完美的

将((您的活动名称)适配器上下文)替换为活动,以便获取当前活动

View.getContext()
不必返回
活动的
上下文。基本上,它可以是用于扩大此视图的任何
上下文。在您的情况下,用于在适配器中膨胀视图的
上下文是
ApplicationContext
。对于快速修复,您可以更改
RecyclerAdapter
onCreateViewHolder
方法中使用的
上下文。我不确定你是如何膨胀你的回收视图的,但是可能考虑在<代码> < OnCurATEVIEWHOLD < /COD> < /P>中使用<代码>父。

不过,最好在适配器中创建回调,并将单击事件委托给
RecyclerView

@d-joe是适配器中的v视图吗?你怎么给它充气?似乎您使用应用程序上下文膨胀视图,这可能会导致问题,因为主题与活动上下文关联。您不应该在
适配器中执行
分段事务。相反,创建一个
界面
,将单击(或任何操作)传递回
活动
,并让它执行事务。如果出于某种原因,您真的不想这样做,那么只需修改
适配器
,在其构造函数中专门使用
AppCompatActivity
,并使用它,而不是试图强制转换
视图
上下文
@MikeM。你的意思是在一个界面中进行事务处理?我不知道
适配器
是做什么用的,但我的意思是像中演示的
项ClickListener
界面一样。请注意
活动
是如何实现该接口的,并且
Toast
显示在
onItemClick()
中。您将执行您的事务,而不是
Toast
。我尝试实现您添加的链接中演示的接口和方法。我认为它有效。我还需要将单击的位置返回到列表适配器从中实例化的ListActivity,或者更好地,通过适配器方法getAdapterPosition()获取单击的项数据。我按照您的建议做了,但现在我面临一个新的挑战:我需要将单击的项的数据传递到目标片段。有没有办法让您建议的回调函数返回这样的数据?如果您使用的是回调函数,只需向该函数添加参数并传递数据:)我试过了。我想不出来。如果你认为你能帮忙,你可以看看我的问题。谢谢
int id = currentCountry.getId();

Fragment mdf = new DetailsFragment();

((YOUR_ACTIVITY_NAME) ADAPTER_CONTEXT).getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.fragments_container, mdf)
        .addToBackStack(null)
        .commit();