我正在尝试在我的回收站视图项目中创建一个弹出菜单,该菜单位于片段中。一旦用户点击我的Recycler视图项目上的3个点,就应该创建菜单这里是我的适配器类代码:
class ExampleAdapter(context: Context, exampleList : ArrayList<Stream>) : RecyclerView.Adapter<ExampleAdapter.ViewHolder>() {
var mContext: Context = context
var favorites = exampleList
private var inflator: LayoutInflater? = LayoutInflater.from(context)
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val view = inflator?.inflate(R.layout.favorites_list_item_layout, parent, false)
return ViewHolder(view)
}
override fun getItemCount(): Int {
return favorites.size
}
override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
val st = favorites.get(position)
Picasso.with(mContext).load(favorites.get(position).image).into(holder?.stImage)
holder?.sName?.text = st.name
holder?.bind(st)
holder?.deleteOption?.setOnClickListener(View.OnClickListener {
var popup = PopupMenu(mContext, holder.deleteOption!!)
popup.setOnMenuItemClickListener { item: MenuItem? ->
when (item!!.itemId) {
R.id.delete -> {
Toast.makeText(mContext, "Showing Toast!", Toast.LENGTH_LONG).show()
true
}
else ->false
}
}
popup.menuInflater.inflate(R.menu.favorite_menu,popup.menu)
try {
val fieldMPopup = PopupMenu::class.java.getDeclaredField("mPopup")
fieldMPopup.isAccessible = true
val mPopup = fieldMPopup.get(popup)
mPopup.javaClass
.getDeclaredMethod("setForceShowIcon", Boolean::class.java)
.invoke(mPopup, true)
} catch (e: Exception){
Log.e("Main", "Error showing menu icons.", e)
} finally {
popup.show()
}
})
}
我传递的上下文来自片段,我以这种方式创建了上下文context = activity.applicationContext
,我的错误/异常如下所示:
E / AndroidRuntime:致命异常:主要 处理:com.example.app,PID:9724 android.view.InflateException:二进制XML文件行#17:无法解析索引6处的属性:TypedValue {t = 0x1d / d = 0xffff4081 a = 3 r = 0x7f060035}
popup.show()抛出异常。
这是我最喜欢的菜单代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/delete"
android:title="@string/delete" />
</menu>
这是我的favorites_list_item_layout
的代码 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/five">
<de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/station_image"
android:layout_width="70dp"
android:layout_height="70dp"
app:civ_border_width="@dimen/zero" />
<TextView
android:id="@+id/stations_stream_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/hundred_three"
android:text="Station Name"
android:textColor="@color/white_color"
android:textSize="@dimen/twenty"
android:textStyle="bold"
android:layout_alignParentLeft="true"
android:layout_marginLeft="103dp" />
<TextView
android:id="@+id/delete_options"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/thirteen"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:text="⋮"
android:textColor="@color/white_color"
android:textAppearance="?android:textAppearanceLarge"
android:layout_alignParentRight="true"
android:layout_marginRight="@dimen/thirteen" />
</RelativeLayout>
</LinearLayout>
这是我的ViewHolder类代码
inner class ViewHolder(favoriteView: View?) : RecyclerView.ViewHolder(favoriteView) {
val view = favoriteView
var stationImage: CircleImageView? = null
var stationName: TextView? = null
var deleteOption : TextView? = null
init {
stationImage = view?.findViewById<CircleImageView>(R.id.station_image)
stationName = view?.findViewById<TextView>(R.id.stations_stream_name)
deleteOption = view?.findViewById(R.id.delete_options)
}
答案 0 :(得分:0)
您最好先创建一个界面。在您的活动/片段中初始化它并将其注入适配器。然后将其传递给视图持有者和视图持有者的View.OnclickListener块。你打电话给你的界面的点击方法。之后,您可以轻松地对您的片段/活动采取措施。
//1. Create Interface
public interface RVListener {
void onClick(View view, int position);}
//2. initialise your listener inside your fragment/activity
private RVListener listener = (view, position) -> {
// open your popup menu or ...
};
//3.pass "listener" to the adapter
MyAdapter adapter = new MyAdapter(data,listener);
//4. inside your adapter assign the variable and pass it to view holder
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private RVListener listener;
private List<Data> data = new ArrayList<>();
MyAdapter(List<Data> data, RVListener listener) {
this.listener = listener;
this.data = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
View v = LayoutInflater.from(context).inflate(R.layout.my_layout, parent, false);
return new RowViewHolder(v, listener);
}
}
//5. handle Click inside your viewHolder
public class RowViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private RVListener listener;
RowViewHolder(View v, RecyclerViewClickListener listener) {
super(v);
this.listener = listener;
v.setOnClickListener(this);
}
@Override
public void onClick(View view) {
listener.onClick(view, getAdapterPosition());
}
}
这样做之后。你肯定有Context来做你的弹出窗口。 希望它有所帮助。