【问题标题】:Starting DialogFragment from a class extending RecyclerView.ViewHolder从扩展 RecyclerView.ViewHolder 的类启动 DialogFragment
【发布时间】:2015-11-24 09:08:59
【问题描述】:

我在 recyelerview.viewholder 类的 onClick() 方法中尝试如下。

示例中使用的 SampleDialogFragment 扩展了 DialogFragment。

@Override
public void onClick(View v)
{
SampleDialogFragment df= new SampleDialogFragment();
df.show(v.getContext().getSupportFragmentManager(), "Dialog");
}

我在v.getContext().getSupportFragmentManager() 遇到问题。我无法调用 getSupportFragmentManager()。

我也试过如下。

@Override
public void onClick(View v)
{
SampleDialogFragment df= new SampleDialogFragment();
SampleActivity activity = new SampleActivity();
df.show(activity.getSupportFragmentManager(), "Dialog");
}

SampleActivity 是附加回收器视图的活动。它显示没有错误。当我运行应用程序并崩溃时。

日志显示活动已破坏。

有什么办法吗?

【问题讨论】:

  • 通过适配器的构造函数传入Context,并使用它来获取FragmentManger 实例。或者使用回调方法监听 SampleActivity 中的点击事件。不要创建new SampleActivity()
  • getActivity().getSupportFragmentManager() 如果你有片段
  • @Boss 我试过了。我无法使用 recyclerview.viewholder 中的上下文调用 getSupportFragmentManager。
  • @kishorejethava 我试过了,没用
  • 我可以使用我传递给这个类的上下文来烤面包。但是,getsupportFragmentManager 不起作用

标签: android android-recyclerview android-dialogfragment dialogfragment


【解决方案1】:

正确的方法是使用接口。

public interface OnItemClickListener {
    void onItemClicked(View v);
}

并在 onClick 方法被触发时调用接口方法。

public class YourListAdapter extends RecyclerView.Adapter<...>

//your code
private OnItemClickListener listener;

public YourListAdapter(OnItemClickListener listener /*your additional parameters*/) {
    this.listener = listener;
    //...
}

@Override
public void onClick(View v){    
    listener.onItemClicked(View v);
}
}

您必须从SampleActivity 传递OnItemClickListener 接口实例

让它在你的SampleActivity中实现它

public class SampleActivity extends FragmentActivity implements OnItemClickListener {

    @Override
    public void onItemClicked(View v) {
        SampleDialogFragment df= new SampleDialogFragment();
        df.show(getSupportFragmentManager(), "Dialog");
    }
}

【讨论】:

  • @Boss 你能解释更多,或者链接到一个例子吗? OnItemClickListener 接口应该在哪里?所有这些代码是如何组合在一起的?
  • @YuvalLevy 您可以为接口创建一个新文件或将其放入适配器类中。 所有这些代码组合在一起 是什么意思?它们是单独的文件。
  • 到底是不是在RecyclerView中点击时希望调用的方法是fragment类里面的方法? @老板
  • 所以如果这对我来说更舒服,我可以在没有界面的情况下制作它,或者有什么理由不这样做?
  • @YuvalLevy OP 想要在适配器中获取SupportFragmentManager 的实例以显示他的DialogFragment。有两种方法。他可以将SupportFragmentManager 实例从他的FragmentActivity 传递给适配器并从适配器调用DialogFragment,或者他可以使用接口并在Activity/Fragment 本身中处理点击事件。我认为使用界面是正确的方法。
【解决方案2】:

我最简单的使用方法

public class AdapterProduct extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

FragmentManager FragManager ;
    // in constructor
    public AdapterProduct(Context context, RecyclerView view ,
 ArrayList<Product> items , FragmentManager getSupportFragmentManager) {
        this.items = items;
        ctx = context;
        FragManager = getSupportFragmentManager;
        lastItemViewDetector(view);
    }
}

在点击中

@Override
public void onClick(View v)
{
SampleDialogFragment df= new SampleDialogFragment();
SampleActivity activity = new SampleActivity();
df.show(FragManager , "Dialog");
}

在您的 MainActivity 或您设置回收视图的位置

AdapterProduct mAdapter = new AdapterProduct(MainActivity.this, rv_Daily_Deals,
BeanProduct,getSupportFragmentManager());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2016-02-01
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多