Android 在适配器类中调用自定义对话框
我已经创建了一个简单的Android 在适配器类中调用自定义对话框,android,dialog,android-recyclerview,adapter,Android,Dialog,Android Recyclerview,Adapter,我已经创建了一个简单的自定义对话框类,我想在单击RecycleView中的一行后显示它。 我的对话类看起来: public class AddToQueueDialog extends Dialog implements View.OnClickListener { Activity mActivity; private TextView textView1; private TextView textView2; private Button save; public AddToQueu
自定义对话框
类,我想在单击RecycleView
中的一行后显示它。
我的对话类看起来:
public class AddToQueueDialog extends Dialog implements View.OnClickListener {
Activity mActivity;
private TextView textView1;
private TextView textView2;
private Button save;
public AddToQueueDialog(Activity activity){
super(activity);
mActivity = activity;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_to_queue);
textView1 = (TextView) findViewById(R.id.textView5);
textView2 = (TextView) findViewById(R.id.textView6);
save = (Button) findViewById(R.id.button4);
save.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == save.getId()){
Log.d("save", "save");
}
}
}
我想知道如何正确调用RecycleView的adapter
,它看起来:
(件)
公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
公共视图持有者(上下文上下文、视图项视图、列表位置){
超级(项目视图);
this.context=上下文;
info=(TextView)itemView.findViewById(R.id.TextView);
收藏夹=(按钮)itemView.findViewById(R.id.addToFav);
收藏夹.setOnClickListener(此);
info.setOnClickListener(此);
this.washLocations=washLocations;
dataBaseHelper=新的dataBaseHelper(上下文);
}
@凌驾
公共void onClick(视图v){
if(v.getId()==info.getId()){
AddToQueueDialog AddToQueueDialog=新建AddToQueueDialog(MapsActivity.this);
addToQueueDialog.show();
}
在我的自定义对话框
类中,我需要arg中的活动
作为构造函数,但我不知道应该在适配器
类中传递哪个活动
{
class MyAdapter extends RecyclerView.Adapter<VH> {
// set this field through setter or constructor
private OnClickListener mMyOnClickListener;
...
void onBindViewHolder(..., VH viewHolder) {
viewHolder.rootView.setOnClickListener(() -> {
if (mOnClickListener != null) {
mOnClickListener.onClick();
}
});
}
static class VH extends ViewHolder {
View rootView;
VH(View itemView) {
super(itemView);
rootView = itemView;
}
}
}
class MainActivity extends AppCompatActivity {
...
void setUpRecyclerView(){
...
adapter.setMyOnClickListener(() -> {
new Dialog(MainActivity.this).show();
});
}
}
//通过setter或构造函数设置此字段
私有OnClickListener mmyoncClickListener;
...
在BindViewHolder上无效(…,VH viewHolder){
viewHolder.rootView.setOnClickListener(()->{
if(mOnClickListener!=null){
mOnClickListener.onClick();
}
});
}
静态级VH扩展了可视支架{
视图根视图;
VH(查看项目视图){
超级(项目视图);
rootView=itemView;
}
}
}
类MainActivity扩展了AppCompatActivity{
...
void setUpRecyclerView(){
...
adapter.setMyOnClickListener(()->{
新建对话框(MainActivity.this.show();
});
}
}
只需将当前活动的上下文
传递给适配器
类,并在创建AddToQueueDialog
实例时使用它即可
例如:
MainActivity.java
public class MainActivity extends AppCompatActivity {
Context mContext;
// Views
RecyclerView mRecyclerView;
// Values
List<Recipe> mRecipeList;
// Adapter
RecipeAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
// Views
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
.................
..........................
// Values
mRecipeList = new ArrayList<Recipe>();
// Adapter
mAdapter = new RecipeAdapter(mContext, mRecipeList);
// Set adapter to RecyclerView
mRecyclerView.setAdapter(mAdapter);
.................
..........................
}
}
public class RecipeAdapter extends RecyclerView.Adapter<RecipeAdapter.ViewHolder> {
Context mContext;
LayoutInflater mInflater;
// List
List<Recipe> mRecipeList;
public GroupListAdapter(Context context, List<Recipe> listRecipe) {
this.mContext = context;
this.mRecipeList = listRecipe;
mInflater = LayoutInflater.from(mContext);
}
.....................
...............................
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ViewHolder(View itemView) {
super(itemView);
info = (TextView) itemView.findViewById(R.id.textView);
favorite = (Button) itemView.findViewById(R.id.addToFav);
favorite.setOnClickListener(this);
info.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == info.getId()){
AddToQueueDialog addToQueueDialog = new AddToQueueDialog(mContext);
addToQueueDialog.show();
}
}
}
............
......................
}
希望这将有助于~更好地通过接口回调从片段/activity调用dialog为什么?您可以发布一个示例吗?@bielas您需要传递当前运行的activity AddToQueueDialog AddToQueueDialog=new AddToQueueDialog((activity)context);AddToQueueDialog.show()的实例;@user3333848是的,我知道,但问题是我到底应该通过哪个活动?对不起,代码是从iPad上写的。你可以用带有参数的方法创建自己的接口,将任何参数从适配器传递到该接口方法中,并在活动中处理它们,或者只是触发一个事件,如我的示例中所示。我认为它与我的考试不匹配例如,在我的活动类中,我有一些逻辑连接到谷歌地图。在第二个类中,我有一个RecycleView和Adapter的实现。因此,我想有一个不同类的示例-一个用于活动,第二个用于RecycleView和Adapter。您是否愿意创建一个上面描述的示例?那么@AlexanderGoncharenko的问题solution@bielas,我已经做了,试着理解这个例子
public class RecipeAdapter extends RecyclerView.Adapter<RecipeAdapter.ViewHolder> {
Context mContext;
LayoutInflater mInflater;
// List
List<Recipe> mRecipeList;
public GroupListAdapter(Context context, List<Recipe> listRecipe) {
this.mContext = context;
this.mRecipeList = listRecipe;
mInflater = LayoutInflater.from(mContext);
}
.....................
...............................
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ViewHolder(View itemView) {
super(itemView);
info = (TextView) itemView.findViewById(R.id.textView);
favorite = (Button) itemView.findViewById(R.id.addToFav);
favorite.setOnClickListener(this);
info.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == info.getId()){
AddToQueueDialog addToQueueDialog = new AddToQueueDialog(mContext);
addToQueueDialog.show();
}
}
}
............
......................
}