有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

recycleview中的java Android弹出菜单不工作?

我曾尝试将子菜单添加到recycleview,但当每行单击子菜单时,都会显示一条消息:不幸的是,应用程序已停止 之后,应用程序将自动关闭

activity_main.xml 

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    安卓:layout_width="match_parent"
    安卓:layout_height="match_parent">

    <安卓.support.v7.widget.RecyclerView
        安卓:id="@+id/rvAnimals"
        安卓:layout_width="match_parent"
        安卓:layout_height="match_parent"/>

</RelativeLayout>

// recycleview_row.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    安卓:layout_width="match_parent"
    安卓:layout_height="wrap_content"
    安卓:orientation="horizontal"
    安卓:padding="10dp">
    <TextView
        安卓:id="@+id/tvAnimalName"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:textSize="20sp"/>
    <TextView
        安卓:id="@+id/textViewOptions"
        安卓:layout_width="wrap_content"
        安卓:layout_height="wrap_content"
        安卓:layout_alignParentRight="true"
        安卓:layout_alignParentTop="true"
        安卓:paddingLeft="@dimen/activity_horizontal_margin"
        安卓:text="&#8942;"
        安卓:textAppearance="?安卓:textAppearanceLarge" />

</LinearLayout>

// MainActivity class

    package com.example.hamoda.recyvlastexample;
import 安卓.support.v7.app.AppCompatActivity;
import 安卓.os.Bundle;
import 安卓.support.v7.widget.LinearLayoutManager;
import 安卓.support.v7.widget.RecyclerView;
import 安卓.view.View;
import 安卓.widget.Toast;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {
    MyRecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // data to populate the RecyclerView with
        ArrayList<String> animalNames = new ArrayList<>();
        animalNames.add("Horse");
        animalNames.add("Cow");
        animalNames.add("Camel");
        animalNames.add("Sheep");
        animalNames.add("Goat");
        // set up the RecyclerView
        RecyclerView recyclerView =(RecyclerView) findViewById(R.id.rvAnimals);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new MyRecyclerViewAdapter(this, animalNames);
        adapter.setClickListener(this);
        recyclerView.setAdapter(adapter);
    }


    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
    }
}

// MyRecyclerViewAdapter class

    package com.example.hamoda.recyvlastexample;
import 安卓.content.Context;
import 安卓.support.v7.widget.PopupMenu;
import 安卓.support.v7.widget.RecyclerView;
import 安卓.view.LayoutInflater;
import 安卓.view.MenuItem;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.TextView;
import java.util.Collections;
import java.util.List;

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
    private List<String> mData = Collections.emptyList();
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;
    // data is passed into the constructor
    public MyRecyclerViewAdapter(Context context, List<String> data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }
    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         View view = mInflater.inflate(R.layout.recyclerview_row, parent,false);
         ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }
    // binds the data to the textview in each row
    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        String animal = mData.get(position);
        holder.myTextView.setText(animal);
        holder.buttonViewOption.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //  creating a popup menu
              PopupMenu popup = new PopupMenu((Context)mData,holder.buttonViewOption);
            /*
                //inflating menu from xml resource
                popup.inflate(R.menu.options_menu);
                //adding click listener
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.menu1:
                                //handle menu1 click
                                break;
                            case R.id.menu2:
                                //handle menu2 click
                                break;
                            case R.id.menu3:
                                //handle menu3 click
                                break;
                        }
                        return false;
                    }
                });
                //displaying the popup
                popup.show();
                */
            }
        });
    }
    // total number of rows
    @Override
    public int getItemCount() {
        return mData.size();
    }
    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView myTextView;
        public TextView buttonViewOption;
        public ViewHolder(View itemView) {
            super(itemView);
            myTextView = (TextView) itemView.findViewById(R.id.tvAnimalName);
            itemView.setOnClickListener(this);
            //textViewDesc = (TextView) itemView.findViewById(R.id.textViewDesc);
            buttonViewOption = (TextView) itemView.findViewById(R.id.textViewOptions);
        }
        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view,getAdapterPosition());
        }

    }
    // convenience method for getting data at click position
    public String getItem(int id) {
        return mData.get(id);
    }
    // allows clicks events to be caught
    public void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }
    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

错误日志:

03-31 11:13:57.461 10139-10139/com.example.hamoda.recyvlastexample E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.hamoda.recyvlastexample, PID: 10139
java.lang.ClassCastException: java.util.ArrayList cannot be cast to 安卓.content.Context
at com.example.hamoda.recyvlastexample.MyRecyclerViewAdapter$1.onClick(MyRecyclerViewAdapter.java:38)
at 安卓.view.View.performClick(View.java:5076)
at 安卓.view.View$PerformClick.run(View.java:20279)
at 安卓.os.Handler.handleCallback(Handler.java:739)
at 安卓.os.Handler.dispatchMessage(Handler.java:95)
at 安卓.os.Looper.loop(Looper.java:135)
at 安卓.app.ActivityThread.main(ActivityThread.java:5910)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

共 (1) 个答案

  1. # 1 楼答案

    PopupMenu构造函数中没有传递上下文,在上下文中强制转换数据列表对象是错误的

    PopupMenu popup = new PopupMenu((Context)mData,holder.buttonViewOption);
    

    在下面一行使用:

    PopupMenu popup = new PopupMenu(context,holder.buttonViewOption);
    

    在上面的行中,上下文是活动上下文的引用,它在代码中的MyRecyclerViewAdapter构造函数中传递,请参见以下内容:

    //数据被传递到构造函数中

    public MyRecyclerViewAdapter(Context context, List<String> data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }
    

    因此,创建一个context的全局引用,并传入PopupMenu构造函数