从适配器调用片段方法

2024-03-06

我需要在适配器中调用 Fragment 方法,但出现错误:

ClassCastException:Main(MainActivity) 无法转换为 PlayPauseClick(Interface)

我在我的片段中实现了我的界面,但我仍然收到此错误,因为一位朋友已经告诉我了mContext(我的适配器上下文)不能是Fragment.

那么我该如何解决这个问题呢?

我的片段方法:

private FunDapter<Product> adapter;
private ArrayList<Product> productList;
private ListView lvProduct;

adapter = new FunDapter<>(getActivity(), productList, R.layout.d_layout_list_d, dict);
lvProduct.setAdapter(adapter);

// My method
@Override
public void imageButtonOnClick(View v, int position){
  playPause=(ImageView)v.findViewById(R.id.playPause);
  Product m = productList.get(position);
  playPause.setImageResource(m.getPlayPauseId());
  playPause.setTag(position);
  playPause.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
            int pos = (Integer) v.getTag();
            Product m =(Product) productList.get(pos);
            if (paused) {
            m.setPlayPauseId(R.drawable.ic_pause);
            paused=false;
            }else {
             m.setPlayPauseId(R.drawable.ic_play);
             paused = true;
            }
       }

    });
}

界面:

public interface PlayPauseClick{
 void imageButtonOnClick(View v, int position);
}

还有我的适配器:

public class FunDapter<T> extends BaseAdapter implements Filterable  {

protected List<T> mDataItems;
protected LongExtractor<T> idExtractor;
protected final Context mContext;
private final int mLayoutResource;
private final BindDictionary<T> mBindDictionary;
private FunDapterFilter<T> funDapterFilter;


public FunDapter(Context context, List<T> dataItems, int layoutResource,
                 BindDictionary<T> dictionary) {
  this(context, dataItems, layoutResource, null, dictionary);
}

public FunDapter(Context context, List<T> dataItems, int layoutResource,
                 LongExtractor<T> idExtractor, BindDictionary<T> dictionary) {
    this.mContext = context;
    this.mDataItems = dataItems;
    this.mOrigDataItems = dataItems;
    this.mLayoutResource = layoutResource;
    this.idExtractor = idExtractor;
    this.mBindDictionary = dictionary;

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    View v = convertView;
    final GenericViewHolder holder;
    if (null == v) {
        LayoutInflater vi =
                (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(mLayoutResource, null);
        holder = new GenericViewHolder();
        holder.root = v;



    holder.playPause=(ImageView)v.findViewById(R.id.playPause); 
    holder.playPause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((PlayPauseClick)mContext).imageButtonOnClick(v, position);        
        }
    });


    return v;
}

如果您想在 Fragment 上定义接口,那么您需要将其显式设置到 Adapter 上,而不是依赖 Context 来为您处理它,因为Activity is mContext,不是你的片段。

所以,这是您定义了接口的适配器。当您单击按钮时它会被激活。

public class FunDapter<T> extends BaseAdapter implements Filterable  {

    public interface PlayPauseClick {
     void imageButtonOnClick(View v, int position);
    }

    private PlayPauseClick callback;

    ...

    public void setPlayPauseClickListener(PlayPauseClick listener) {
        this.callback = listener;
    }

    ...

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ...
        holder.playPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (callback != null) {
                    callback.imageButtonOnClick(v, position);
                }

在片段中,您可以实现该接口(也称为回调)

public class YourFragment extends Fragment 
    implements YourAdapter.PlayPauseClick // see here

    // private ... adapter;
    private List<Product> data = new ArrayList<Product>();

    @Override 
    public View onCreateView(...) {
        // Set your adapter
        // Pass the listener here
        this.adapter = new FunDapter<Product>(...); 
        this.adapter.setPlayPauseClickListener(this);
    }

    @Override
    public void imageButtonOnClick(View v, int position) {
        // TODO: Implement this
    }

并且您应该删除 Activity 类上的接口实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从适配器调用片段方法 的相关文章

随机推荐

  • 带有 gcc stdlib 的 icpc C++11

    我正在使用 icpc 非可选 并且使用 std c 0x 进行编译 因此我可以使用ambas 然而 当我这样做时 它会使用 gcc stdlib 创建 havok 其中一个支持另一个不支持的功能 我尝试过定义 GXX EXPERIMENTA
  • 使用指定存储库中的 Git 分支动态填充 Jenkins Choice 参数

    我有一个参数化的 Jenkins 作业 它需要输入特定 Git 存储库中的特定 Git 分支 目前该参数是一个字符串参数 有没有办法让这个参数成为选择参数并用Git分支动态填充下拉列表 我不想要求有人在每次创建新分支时手动配置下拉列表来维护
  • php-fpm 进程监控/分析

    我最近遇到了 php fpm 进程使用 如活动进程数量 的问题 达到了最大可用进程的峰值 并停止执行其他脚本 直到有问题的进程完成 更详细一点 我当前的 php fpm 设置是 pm static pm max children 100 我
  • 在 Java 中以编程方式清除控制台

    我创建了一个示例 Java 应用程序 我想清除窗口选项 即 Register Login Clear 如果用户按 3 我需要以编程方式清除所有选项 就像是Console clear 有什么办法可以用 Java 做到这一点吗 您将需要输出一堆
  • 如何将较小的位图复制到较大的位图?

    希望这应该是一个简单的问题 我正在尝试将一系列小位图复制到较大的位图中 将它们并排排列 像素中没有任何间隙或重叠 例如 如果我有 3 个正方形位图 我想将它们复制到一个细长的矩形中 我知道如何做相反的事情 即从较大的位图创建一个小位图 但不
  • 与应用内购买的“无法连接到 iTunes”相关的供应商 ID 错误消息是什么?

    这是一条神秘的错误消息 LaunchServices 无法获取供应商ID 我猜这是某个苹果服务器现在宕机了 很快就会恢复在线 背景 我的 iOS 应用程序之前没有批准的应用内购买 因此这仍然是必须提交新版本应用程序以及新的应用内购买产品的阶
  • Angular 5 无法找到“object”类型的不同支持对象“[object Object]”。 NgFor 仅支持绑定到 Iterables,例如数组

    我正在尝试从我的后端 api 返回产品并将其显示在我的前端页面上 当我执行 ngFor 循环时 它给了我一个错误 这是我的代码 我的后端API data 0 name perferendis totalPrice 323 76 rating
  • Rails 设计:after_confirmation

    有没有办法创建一个after confirmation do something 目标是在用户确认使用 Devise 后发送电子邮件 confirmable 我正在使用 Devise 3 1 2 它有一个占位符方法after confirm
  • 如何使用stdext::hash_map?

    我想看一个如何正确重写 stdext hash compare 的简单示例 以便为我自己的用户定义类型定义新的哈希函数和比较运算符 我正在使用 Visual C 2008 这就是你可以做到的 class MyClass Hasher con
  • Vue Axios 动态 URL

    我想在 vue js 应用程序中动态创建 axios post 操作的 URL 路径 这是动作 editProduct function dispatch commit payload axios put http localhost 80
  • 如何删除单个链表中的循环?

    我不确定在不使用 O N 内存和标志的情况下如何找到循环的开始 找到循环内部的一个节点 具体参见1800 INFORMATION的回答 我们称这个节点为C 通过将指针从 C 前进直到再次到达 C 来求出循环的长度 循环的长度是它所采取的步数
  • 如何在方案中编写程序来查找数字列表的因数

    这是单个整数的代码 它如何扩展到函数列表 define factors n define factors d cond gt d n list modulo n d 0 cons d factors d 1 else factors d 1
  • Java日历的setMonth方法工作错误吗?

    我有如下的小代码 我预计结果应该是7 但它打印了6 如果我取消注释该行tmp get Calendar MONTH 它运行正常 打印7 请告诉我原因 我在 MacOS 中使用 JDK 1 7 0 25 public static void
  • 安装 scrapy 清理失败

    我一直在努力得到Scrapy使用 pip 安装 以便抓取 NBA 赛季的赛程表和得分 在过去的 6 个小时里 我一直在努力尝试安装它 我已经逐字按照设置说明进行操作 但仍然无法使其正常工作 任何帮助将不胜感激 终端窗口输出如下 非常感谢 顺
  • Keycloak 重定向 URI 正在将端口 0 添加到 url

    在keycloak 中遇到redirect uri 错误 发现 JIRA 记录了相同的问题KEYCLOAK 7237 https issues jboss org browse KEYCLOAK 7237 只是想检查一下是否有解决办法 有人
  • AngularJS:是否可以使控制器中的特定表单输入字段无效?

    我有一个地址文本输入字段 每当输入地址并单击输入字段旁边的搜索按钮时 我都会对地址进行地理编码 并将输入文本替换为地理编码器的结果 我还设置了一个范围变量 addressOk 是否可以根据以下内容使该特定表单输入字段无效 scope add
  • 将原始 JSON 加载到 Pig 中

    我有一个文件 其中每一行都是一个 JSON 对象 实际上 它是 stackoverflow 的转储 我想尽可能轻松地将其加载到 Apache Pig 中 但我无法弄清楚如何告诉 Pig 输入格式是什么 这是一个条目的示例 id oid 50
  • 为什么 C 提供的整数类型对于基本上任何项目来说都不够好?

    我更像是一名系统管理员而不是程序员 但我确实花费了大量的时间研究程序员的代码 试图找出问题所在 以及数量令人不安的that当程序员期望 u ll int32 t 或其他任何定义 是的 我知道这不是真的 但要么期望定义该类型的文件位于其他地方
  • 记录 CMake 脚本

    我发现自己处于一种情况 我想准确记录大量自定义 CMake 宏和函数 并且想知道如何做到这一点 首先想到的是简单地使用内置语法并且仅使用文档脚本 如下所示 FUNCTION NAME MACRO NAME description 这可以 但
  • 从适配器调用片段方法

    我需要在适配器中调用 Fragment 方法 但出现错误 ClassCastException Main MainActivity 无法转换为 PlayPauseClick Interface 我在我的片段中实现了我的界面 但我仍然收到此错