Android RecyclerView适配器中的弹出窗口
我是android的新手,我尝试在点击RecyclerView项时显示弹出窗口,但有点困惑,我看了一下,但无法理解这个上下文问题Android RecyclerView适配器中的弹出窗口,android,popup,android-recyclerview,adapter,Android,Popup,Android Recyclerview,Adapter,我是android的新手,我尝试在点击RecyclerView项时显示弹出窗口,但有点困惑,我看了一下,但无法理解这个上下文问题 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private ArrayList<Mission> mDataset; public MyAdapter(ArrayList<Mission> myDataset) {
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private ArrayList<Mission> mDataset;
public MyAdapter(ArrayList<Mission> myDataset) {
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.mission_card_item, parent, false);
// set the view's size, margins, paddings and layout parameters
MyViewHolder vh = new MyViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.mTextView.setText(mDataset.get(position).getName());
holder.mPointView.setText(mDataset.get(position).getPoint());
holder.mRankView.setText(mDataset.get(position).getRank());
holder.btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(v.getContext(),"Buton Clicked", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public class MyViewHolder extends RecyclerView.ViewHolder {
public CardView mCardView;
public TextView mTextView;
public TextView mPointView;
public TextView mRankView;
public Button btnAdd;
public MyViewHolder(final View itemView) {
super(itemView);
mCardView = (CardView) itemView.findViewById(R.id.card_view);
mTextView = (TextView) itemView.findViewById(R.id.tv_text);
mRankView = (TextView) itemView.findViewById(R.id.tv_rank);
mPointView = (TextView) itemView.findViewById(R.id.tv_point);
btnAdd = (Button) itemView.findViewById(R.id.button_add);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPopup(itemView);
Toast.makeText(itemView.getContext(),"Element " + getAdapterPosition() + " clicked", Toast.LENGTH_SHORT).show();
Log.d("hello", "Element " + getAdapterPosition() + " clicked.");
}
});
}
}
public void showPopup(View view) {
View popupView = LayoutInflater.from(getActivity()).inflate(R.layout.popup_layout, null);
final PopupWindow popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
Button btnDismiss = (Button) popupView.findViewById(R.id.ib_close);
btnDismiss.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
}
});
popupWindow.showAsDropDown(popupView, 0, 0);
}}
公共类MyAdapter扩展了RecyclerView.Adapter{
私有ArrayList数据集;
公共MyAdapter(ArrayList myDataset){
mDataset=myDataset;
}
//创建新视图(由布局管理器调用)
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
//创建新视图
视图v=LayoutInflater.from(parent.getContext())
.充气(R.layout.mission\u card\u项目,父项,错误);
//设置视图的大小、边距、填充和布局参数
MyViewHolder vh=新的MyViewHolder(v);
返回vh;
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
holder.mTextView.setText(mDataset.get(position.getName());
holder.mPointView.setText(mDataset.get(position.getPoint());
holder.mRankView.setText(mDataset.get(position.getRank());
holder.btnAdd.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//Toast.makeText(v.getContext(),“Buton Clicked”,Toast.LENGTH_SHORT.show();
}
});
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
//提供对每个数据项的视图的引用
//复杂数据项可能需要每个项有多个视图,并且
//您可以访问视图持有者中数据项的所有视图
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共CardView-mCardView;
公共文本视图mTextView;
公共文本视图;
公共文本视图;
公共按钮btnAdd;
公共MyViewHolder(最终视图项视图){
超级(项目视图);
mCardView=(cardwiew)itemView.findviewbyd(R.id.card_视图);
mTextView=(TextView)itemView.findviewbyd(R.id.tv_text);
mRankView=(TextView)itemView.findViewById(R.id.tv_排名);
mPointView=(TextView)itemView.findViewById(R.id.tv_点);
btnAdd=(Button)itemView.findviewbyd(R.id.Button\u add);
itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
显示弹出窗口(项目视图);
Toast.makeText(itemView.getContext(),“Element”+getAdapterPosition()+“clicked”,Toast.LENGTH_SHORT).show();
d(“hello”,“Element”+getAdapterPosition()+“clicked”);
}
});
}
}
公共无效显示弹出窗口(视图){
View popupView=LayoutInflater.from(getActivity()).flate(R.layout.popup\u布局,null);
final PopupWindow PopupWindow=新的PopupWindow(popupView,WindowManager.LayoutParams.MATCH_父项,WindowManager.LayoutParams.MATCH_父项);
按钮btnDismiss=(按钮)popupView.findViewById(R.id.ibu关闭);
btnDismiss.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
popupWindow.disclose();
}
});
显示下拉列表(popupView,0,0);
}}
这是我的简单弹出窗口布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rl_custom_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp"
android:background="#ab2fc4"
>
<ImageButton
android:id="@+id/ib_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:background="@null"
/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is a sample popup window."
android:layout_centerInParent="true"
android:padding="25sp"
/>
</RelativeLayout>
getActivity()无法解析并给出错误,如果有人能提供帮助,我将不胜感激。问题是您试图在适配器内调用方法getActivity()。适配器将没有对活动或上下文的引用。活动将引用上下文,片段将引用父活动和上下文(getActivity()和getContext() 因此,在代码中进行这些更改首先从片段或活动将上下文传递给适配器的构造函数。然后使用该上下文来扩大布局。
private ArrayList<Mission> mDataset;
private Context mContext;
public MyAdapter(ArrayList<Mission> myDataset, Context context) {
mDataset = myDataset;
this.mContext = context;
}
此外,可以使用相同的上下文在onCreateViewHolder中展开布局。您所做的也是正确的parent.getContext()
如果你只需要一个弹出窗口。创建一个对话框片段
public class PopupDialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.popup_layout, container,
false);
return rootView;
}
}
下一步启动此对话框片段。试试这个。您还可以自定义dialogfragment以满足您的需要
public void showPopup() {
PopupDialogFragment dialogFragment = new PopupDialogFragment();
dialogFragment.show(((FragmentActivity)mContext).getSupportFragmentManager(), "OpenPopup");
}
问题是您试图在适配器内调用方法getActivity()。适配器将没有对活动或上下文的引用。活动将引用上下文,片段将引用父活动和上下文(getActivity()和getContext() 因此,在代码中进行这些更改首先从片段或活动将上下文传递给适配器的构造函数。然后使用该上下文来扩大布局。
private ArrayList<Mission> mDataset;
private Context mContext;
public MyAdapter(ArrayList<Mission> myDataset, Context context) {
mDataset = myDataset;
this.mContext = context;
}
此外,可以使用相同的上下文在onCreateViewHolder中展开布局。您所做的也是正确的parent.getContext()
如果你只需要一个弹出窗口。创建一个对话框片段
public class PopupDialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.popup_layout, container,
false);
return rootView;
}
}
下一步启动此对话框片段。试试这个。您还可以自定义dialogfragment以满足您的需要
public void showPopup() {
PopupDialogFragment dialogFragment = new PopupDialogFragment();
dialogFragment.show(((FragmentActivity)mContext).getSupportFragmentManager(), "OpenPopup");
}
我添加了一个答案来回答您的问题,请让我知道这是否有帮助…我添加了其他内容。您可以检查对话片段的代码。我添加了一个答案来回答您的问题,请告诉我这是否有帮助…我添加了其他内容。您可以检查对话框片段的代码。我在我的主片段中也做了更改,我添加了如下上下文MyAdapter=newMyAdapter(myData,getContext());但当我运行应用程序并点击一些RecyclerView项目时,它会导致另一件事情崩溃。我不知道你为什么要把另一个布局放大成一个弹出窗口。。。请参考Android中的对话框片段。可能DialogFragment就是您要查找的java.lang.ClassCastException:android.support.v7.widget.AppCompatImageButton无法在com.example.yusuf.firebasedemoapp.MyAdapter.showPopup(MyAdapter)上强制转换为android.widget.Button。