在回收器视图上创建上下文菜单时,menuInfo 为 null

2024-03-13

我试图在回收器视图中单击项目时显示上下文菜单,并选择呼叫姓名被单击的人。但我无法检索电话号码,因为 getMenuInfo() 不起作用,因为我在 onCreateContextMenu() 的 contextMenuInfo 中得到 null。我参考了很多答案并相应地编写了我的代码,但仍然无法纠正它 这是我的代码:

菜单操作.xml

    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:id="@+id/call"
    android:title="Call">
</item>
<item
    android:id="@+id/sms"
    android:title="Send SMS">

</item>
<item
    android:id="@+id/email"
    android:title="Send email">
</item>
<item
    android:id="@+id/viewContact"
    android:title="View Details">

</item>
<item
    android:id="@+id/editContact"
    android:title="Edit Contact">
</item>
<item
    android:id="@+id/deleteContact"
    android:title="Delete">

</item>
</menu>

我的片段包含回收器视图:

public class MyContacts extends Fragment {
public static RecyclerView recyclerView;
public static Person receivedData;
static Context c;
static int itemIndex;

DatabaseAdapter dbAdapter = new DatabaseAdapter(getContext());
private static RecyclerViewAdapter recyclerViewAdapter;
ArrayList<Person> persons = new ArrayList<>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    c = getContext();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    MainActivity activity = (MainActivity) getActivity();
    receivedData = activity.getData();

    View layout = inflater.inflate(R.layout.fragment_my_contacts, container, false);
    recyclerView = (RecyclerView) layout.findViewById(R.id.myContactsList);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());

    recyclerViewAdapter=new RecyclerViewAdapter(activity, persons);
    recyclerView.setAdapter(recyclerViewAdapter);

    registerForContextMenu(recyclerView);
    retrieve();

    return layout;

}

public void retrieve()
{
    persons.clear();
    DatabaseAdapter databaseAdapter = new DatabaseAdapter(c);
    databaseAdapter.openDB();

    //retrieves the whole table from DB
    Cursor cursor = databaseAdapter.getDataForList();
    // loop and add to array list
    while (cursor.moveToNext())
    {


        int index1 = cursor.getColumnIndex(Constants.PHONE);
        String name = cursor.getString(index1);
           ......
        Person p = new Person(name, phone, address, email, dob, R.id.contactImage);

        persons.add(p);

    }

    //if array list not empty
    if (!(persons.size() <1))
    {
        recyclerViewAdapter.notifyDataSetChanged();
    }
    databaseAdapter.closeDB();

}


@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) // here menuInfo is coming NULL
{
    super.onCreateContextMenu(menu, view, menuInfo);
    getActivity().getMenuInflater().inflate(R.menu.menu_actions, menu);
    menu.setHeaderTitle("Actions");

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
    itemIndex = info.position;
}

public boolean onContextItemSelected(MenuItem item)
{       

    switch (item.getItemId())
    {
        case R.id.call:
         call();

            Toast.makeText(getContext(), "Calling...", Toast.LENGTH_LONG).show();
            return true;
        case R.id.sms:
            Toast.makeText(getContext(), "SMS", Toast.LENGTH_LONG).show();
            return true;
        case R.id.email:
            Toast.makeText(getContext(), "Email", Toast.LENGTH_LONG).show();
            return true;
        case R.id.editContact:
            Toast.makeText(getContext(), "Editing", Toast.LENGTH_LONG).show();
            return true;
        case R.id.deleteContact:
            Toast.makeText(getContext(), "Deleting", Toast.LENGTH_LONG).show();
            return true;
        default:
            return super.onContextItemSelected(item);

    }
}

private void call() {
    Log.d("PHONE", String.valueOf(itemIndex));
    receivedData = (Person)dbAdapter.getPhone(itemIndex);
    Log.d("PHONE",receivedData.getPhone().toString());

    Intent call = new Intent(Intent.ACTION_CALL);
    call.setData(Uri.parse("tel:" + receivedData.getPhone()));
    startActivity(call);
}

上下文菜单 RecyclerView:

public class ContextMenuRecyclerView extends RecyclerView {
private RecyclerContextMenuInfo mContextMenuInfo ;

public ContextMenuRecyclerView(Context context) {
    super(context);
}
public ContextMenuRecyclerView(Context context, AttributeSet attrs)
{
    super(context,attrs);
}
public ContextMenuRecyclerView(Context context, AttributeSet attrs, int defStyle)
{
    super(context,attrs,defStyle);
}

//I think problem is somewhere in this function. I dont think its getting called.
@Override
protected ContextMenu.ContextMenuInfo getContextMenuInfo()
{
    return mContextMenuInfo;
}

@Override
public boolean showContextMenuForChild(View originalView)
{
    final int longPressPosition = getChildAdapterPosition(originalView);
    if (longPressPosition >=0)
    {
        final long longPressId = MyContacts.recyclerView.getAdapter().getItemId(longPressPosition);  //MyContacts.recyclerView.
        mContextMenuInfo = new RecyclerContextMenuInfo(longPressPosition, longPressId);//createContextMenuInfo
        return super.showContextMenuForChild(originalView);
    }
    return false;
}


public static class RecyclerContextMenuInfo implements ContextMenu.ContextMenuInfo
{
    //position in adapter for which context menu is being displayed
    final public int position;

    //row id of the item for which context menu is being displayed
    final public long id;

    public RecyclerContextMenuInfo(int position, long id)
    {
        this.position = position;
        this.id = id;
    }
  }
} 

我的 RecyclerView 适配器

   public class RecyclerViewAdapter extends     RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>{

static Context c;
private LayoutInflater inflater;
List<Person> persons = Collections.emptyList();

public RecyclerViewAdapter(FragmentActivity context, List<Person> persons){
    inflater = LayoutInflater.from(context);
    this.persons = persons;
    this.c = context;
}


//Initializing view holder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
   View view  = inflater.inflate(R.layout.single_row, parent, false);
    MyViewHolder holder = new MyViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {

    Person current = persons.get(position);
    holder.image.setImageResource(R.drawable.contact);
    holder.name.setText(current.getName());
    holder.phone.setText(current.getPhone());

    holder.itemView.setLongClickable(true);
}

@Override
public int getItemCount() {
    return persons.size();
}

@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

public static class MyViewHolder extends RecyclerView.ViewHolder 
{
    ImageView image;
    TextView name;
    TextView phone;
    ItemClickListener itemClickListener;

    ContextMenuRecyclerView recyclerView = new ContextMenuRecyclerView(c);

    public MyViewHolder(View itemView) {

        super(itemView);
        image = (ImageView) itemView.findViewById(R.id.listImage);
        name = (TextView) itemView.findViewById(R.id.listName);
        phone = (TextView) itemView.findViewById(R.id.listPhone);


    }


}

}

请大家帮我解答一下!!


我这样做了,声明了一个私有 MyViewHolder 持有者字段,而不只是将其设置为本地的并在onCreateContextMenu 方法我这样称呼它

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

在回收器视图上创建上下文菜单时,menuInfo 为 null 的相关文章

  • 用于 Kotlin 中单元测试的 BuildConfigField 模拟

    我正在尝试尽可能多地涵盖Kotlin Android 库我遇到了有关自定义 BuildConfig 变量的问题 更广为人知的是buildConfigField 我想模拟这个变量来测试两者true and false values 从 Gra
  • Android:如何暂停和恢复可运行线程?

    我正在使用 postDelayed 可运行线程 当我按下按钮时 我需要暂停并恢复该线程 请任何人帮助我 这是我的主题 protected void animation music6 music4 postDelayed new Runnab
  • 使用同一个侦听器的多个活动

    我有 4 个活动 它们都包含一个 xml 页脚 其中包含 4 个按钮 每个活动一个 我现在想为这些按钮设置 onclicklistener 它是页脚中的自制菜单 问题是 如何使用侦听器以便重用代码 我有两个想法 创建一个实现 onclick
  • 我无法再在后台应用程序中接收任何 FCM 消息

    当应用程序处于后台时 我无法再在应用程序中接收任何数据消息 请注意 直到最近它在我的应用程序中都运行良好 也许在我的开发环境最近更新后它停止工作了 我不能说 所以我尝试用快速入门 android 项目 https github com fi
  • Android 中使用黑白 alpha 蒙版的高效位图蒙版

    我想用黑白 alpha 蒙版来掩盖位图 我的蒙版图像是黑白的 黑色区域意味着透明 白色区域意味着不透明 我需要的是 当我使用此蒙版图像来蒙版任何其他图像时 如果蒙版图像的相应区域为黑色 则生成的图像区域应为透明 否则 生成的图像区域应该是不
  • 蓝牙 BLE Android 以最大吞吐量写入外设

    我们公司开发了一个具有蓝牙 BLE 的硬件单元 并且我们在 Nexus 7 2013 中有一个服务应用程序 我们希望使用它向该单元发送固件文件 文件最大可达 500kb BT芯片是德州仪器CC2540 我浏览了大量的页面 并扫描了 Stac
  • VOIP通话录音

    我正在开发一个在 android 中录制 VOIP 通话的项目 我没有找到任何解决方案 有很多应用程序支持手机上的 VOIP 录音 我找不到任何教程和帮助 立方体通话记录器 https play google com store apps
  • 更改语言 Flutter 的按钮

    我正在 Flutter 中构建一个应用程序 到目前为止 我正在使用 JSON 国际化 其中应用程序的语言基于用户手机中默认的语言 它工作得很好 但我想给用户有机会在不更改手机系统语言设置的情况下更改语言 只需单击按钮 然后应用程序即可更改语
  • Android L,使用 joda.time 库的异常

    该应用程序适用于所有设备 包括 nexus 5 和 nexus 7 在 Android L 预览版上运行相同的应用程序时 应用程序崩溃了 我一直在调试 并且调用 DateTime 构造函数发现了异常 public static String
  • 如何绘制部分位图圆弧?类似于圆形进度轮,但具有显示得越来越多的位图。

    我正在寻找的是一种以顺时针圆形方式显示图像的视图 当进度为 25 时 应显示前 90 度 当进度为 100 时 应绘制完整的 360 度 它与使用 canvas drawArc 非常接近 但此方法仅适用于 Paint 对象 不适用于位图 其
  • Android 和 Google 地图内部片段以及其他控件和 viewpager

    我是android编程新手 我有一个带有 3 个页面 片段 的小应用程序 使用 pageradapter 和 viewpager 在它们之间滑动 其中一个页面包含复选框 和其他控件 和地图 我的问题是程序在启动时崩溃 Fragment co
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 如何在 60 分钟后删除共享首选项

    我想存储登录数据 但希望在 60 分钟后删除该数据 执行此操作的正确方法是什么 在这 60 分钟内可以关闭 停止 打开应用程序 我不想使用内部数据库 这是我的访问代码SharedPreferences sharedpreferences g
  • 如何在同一设备上运行的 Android 应用程序之间传输文件?

    我正在编写一个与 RESTful 服务交互的 Android 应用程序 该 Web 服务本质上是一个文件系统 并提供元数据以及对文件的 CRUD 访问 我的应用程序检索元数据 并通过ContentProvider 我需要添加与我的应用程序在
  • 我在 android studio 中使用 kotlin 时出现错误

    为什么会出现这个错误 09 12 16 36 31 502 1886 1886 com getloction nourmedhat smartgate getlocation E AndroidRuntime 致命异常 main 进程 co
  • Android 操作项上的通知徽章

    我想在操作栏中放置的购物车图像上添加一个通知徽章 并以编程方式操作它 有帮助吗 您可以显示自定义MenuItem on ActionBar通过创建一个custom layout for MenuItem 要设置自定义布局 您必须使用菜单项属
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • TabLayout 的不同 tabMode

    我正在使用 ViewPager 和 TabLayout 如果选项卡可以放置在显示 tabMode 上 则它们必须是 app tabMode fixed else app tabMode scrollable 我怎样才能做到这一点 我不明白你
  • 如何用LoaderManager自动重新查询

    我有一个应用程序显示来自 SQLite DB 的数据 并且数据不断变化 所以显然 我认为我应该使用 LoaderManager 来显示数据 我读过一些关于将 LoaderManager 与 SQLite 结合使用的内容 然后看到了亚历克斯

随机推荐

  • Pandas _metadata的DataFrame持久化错误

    我终于弄清楚如何使用 DataFrame 中的 metadata 一切正常 除了我无法将其持久化 例如 hdf5 或 json 我知道它有效 因为我复制框架 而 metadata 属性复制到 非 metadata 属性则不然 example
  • CakePHP-cakeDC搜索插件实现

    我目前正在尝试找出一种在我的应用程序中实现 cakeDC 搜索插件的方法 但我发现很难理解在我可以让它在我的应用程序中 很好地 工作之前需要完成的管道工作 需要考虑的事项 搜索必须是 实时搜索 检索到的记录需要分页 搜索将使用选定的条件 i
  • Fn 类型未实现 Size

    我想构建一个将列表分成两部分的函数 一个列表包含原始列表中满足特定谓词的元素 另一个列表包含所有不满足特定谓词的元素 以下是我的尝试 fn split filter
  • 除了 Hibernate Validator 的 @SafeHtml 之外,还有哪些替代方案来验证字符串?

    正如 JavaDocs 中所述 它将在未来版本中删除 是否有任何替代库可以通过注释类似地工作 让我们首先解释一下弃用的原因 由于这一限制 我们最近遇到了安全问题 CVE 这是由于我们实施中的一个错误 但它让我们意识到这是非常脆弱的 并且在安
  • Pandas:将列中的值与唯一值相加

    我有数据框 ID time coeff category 111 12 1 5 shop 111 15 1 5 shop 222 12 0 8 shop 222 18 0 8 shop 我需要得到 category unique users
  • Web 应用程序 - 显示月份中日期的滑块功能

    对于学校项目 我们必须构建一个网络应用程序 我将创建一些东西 让人们可以跟踪他们的课程 家庭作业和空闲时间 计划表 日历 我在这里听起来真的很蹩脚 但是嘿 我累了 英语不是我的母语 我将在 CodeIgniter 中处理 PHP 逻辑 并结
  • ssh2节点js sftp协议错误握手失败

    你好 我有一个小问题 我开发了一个带有节点js的脚本sftp客户端 它连接到sftp服务器并抓取一些文件 我用本地服务器测试了它的工作 但是当我尝试将它与生产服务器一起使用时 我收到了这个错误 错误 握手失败 没有匹配的密钥交换算法 我已经
  • 无法联系到会员

    这是我用于显示角色成员的代码 但是 当我为有很多成员的角色调用此命令时 它只返回我的名字 我该如何修复它 V12 let role if message mentions roles first message guild roles ca
  • 使用升压条件变量

    我正在设计一个异步记录器类 如下所示 但是 不确定我是否以正确的方式使用升压条件变量 有人可以对此发表评论吗 这里的processLogEntry方法是一个线程函数 我在这里使用boost void LogWriter stopThread
  • 当我更新我的 sqlite 核心数据存储时,如何避免出现“SQL 执行期间错误:约束失败”?

    我们的应用程序允许用户从 API 提供的列表中选择位置 该列表很少更新 并且仅通过添加项目来更新 因此应用程序不会每次都访问 API 而是在 Core Data sqlite 存储中提供快照 我们希望它定期更新列表 执行此操作的代码如下所示
  • gcc 不匹配标签选项给出“无法识别的命令行选项”

    我试图激活该选项 Wmismatched tags在 gcc 上 检测不一致的类 结构声明 这可能在使用前向声明时发生 但在 Ubuntu 上我得到 c error unrecognized command line option Wmis
  • “替换”功能示例

    我没有找到该项目的帮助页面replace函数从base包很helpful 最糟糕的是 它没有可以帮助理解其工作原理的示例 您能解释一下如何使用它吗 举一两个例子就太好了 如果您查看该函数 通过在控制台中输入其名称 您会发现它只是一个简单的函
  • 我想仅为特定资源运行 terraform

    运行 terraform 并等待需要很长时间 所以我想运行它来排除执行时间最长的rds 或者我只想运行 ec2 资源 有没有办法在地形中做这样的事情 您可以使用 target resource https www terraform io
  • 为什么 DirectFB 没有在 GNU/Linux 中得到更广泛的应用?是否存在 X11 中不存在的严重限制?

    据我了解 DirectFB为多种显卡提供硬件加速 此外 它比 X11 更小 更快 并且占用的内存更少 那么 为什么它没有比现在更主流呢 我真正不确定的是 常见的 GTK Qt 程序是否需要移植到它 在 DirectFB 网站上 有一个将 F
  • 带有 JDBC 准备语句的字符串中的圆括号

    这是我的 Java JDBC 代码 例如修改和简化的 ps connection prepareStatement SELECT a b c FROM mytable WHERE category ps setString 1 my sup
  • C语言数据类型算术规则

    在 C 编程中 如果我在下面的等式中使用变量 k X Y n 其中 exp 是数学常数 e 提升到 pi 3 14159 j sqrt 1 并且这些变量都被声明为 64b 双精度浮点数 其中 X 是复数 输出的结果也将是这种数据类型 out
  • Angular 2 悬停事件

    在新的Angular2框架 有谁知道像事件一样进行悬停的正确方法吗 In Angular1有ng Mouseover 但这似乎并没有被延续下来 我浏览了文档但没有发现任何内容 如果你想在任何 HTML 元素上执行类似悬停的事件 那么你可以这
  • C# 查找解决方案中的所有测试

    我是否可以使用任何技术来查找解决方案中注释为测试的所有测试 TestMethod Fact Theory 语境 我对这一切都很陌生 但正在尝试制定持续部署策略 我想在发布过程期间 之后找到并运行解决方案中的所有测试 这些不是依赖于构建的单元
  • 有多少 WebGL 内存可用?当我用完时会发生什么?

    GPU 内存是有限的 通常比 JS 堆大小等更有限 诸如大量高分辨率图像之类的东西可能会填满内存 而且它是共享资源 因此其他应用程序可能会使用大量内存 在 OpenGL 中 我可以查询可用内存 WebGL 有没有办法做同样的事情 我怎样才能
  • 在回收器视图上创建上下文菜单时,menuInfo 为 null

    我试图在回收器视图中单击项目时显示上下文菜单 并选择呼叫姓名被单击的人 但我无法检索电话号码 因为 getMenuInfo 不起作用 因为我在 onCreateContextMenu 的 contextMenuInfo 中得到 null 我