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="⋮"
安卓: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 楼答案
在
PopupMenu
构造函数中没有传递上下文,在上下文中强制转换数据列表对象是错误的在下面一行使用:
在上面的行中,上下文是活动上下文的引用,它在代码中的
MyRecyclerViewAdapter
构造函数中传递,请参见以下内容://数据被传递到构造函数中
因此,创建一个
context
的全局引用,并传入PopupMenu
构造函数