使用 RecyclerView 的自定义警报对话框
Custom Alert Dialog With RecyclerView
我正在使用 RecyclerView
列出一些文本,现在我想这样当用户单击文本时会弹出一个自定义警报对话框。
到目前为止我已经试过了但是得到了一个 NullPointerException;这里可能有什么问题?
public class CBAdapter extends RecyclerView.Adapter<CBAdapter.ViewHolder> {
List<AdapterData> mItems;
public CBAdapter() {
super();
mItems = new ArrayList<>();
AdapterData data = new AdapterData();
data.setTextOne("Many Bows");
mItems.add(data);
data = new AdapterData();
data.setTextOne("Pardon");
mItems.add(data);
data = new AdapterData();
data.setTextOne("Fall To Knees & Beg");
mItems.add(data);
data = new AdapterData();
data.setTextOne("Backflips");
mItems.add(data);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.test3, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
AdapterData data = mItems.get(i);
viewHolder.textOne.setText(data.getTextOne());
}
@Override
public int getItemCount() {
return mItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
public TextView textOne;
private Context context;
public ViewHolder(View itemView) {
super(itemView);
textOne = (TextView)itemView.findViewById(R.id.textView1);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.custom_dialog);
dialog.setTitle("Title");
TextView text = (TextView) dialog.findViewById(R.id.text);
text.setText("hello world");
ImageView image = (ImageView) dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher);
Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK);
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
});
}
}
}
这不是您查询的答案,而是处理这种情况的更好方法。
Use callback methods.
在你的Activity中:
这将实现我们 Adapter
中的接口。在此示例中,当用户单击 RecyclerView
.
中的项目时将调用它
public class MyActivity extends Activity implements AdapterCallback {
private MyAdapter mMyAdapter;
@Override
public void onMethodCallback() {
// Show your alert
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mMyAdapter = new MyAdapter(this);
}
}
在您的适配器中:
在 Activity 中,我们启动了 Adapter
并将其作为参数传递给构造函数。这将为我们的回调方法启动我们的接口。可以看到我们使用了我们的用户点击回调方法。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private AdapterCallback mAdapterCallback;
public MyAdapter(Context context) {
try {
this.mAdapterCallback = ((AdapterCallback) context);
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement AdapterCallback.");
}
}
@Override
public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) {
// simple example, call interface here
// not complete
viewHolder.itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
mAdapterCallback.onMethodCallback();
} catch (ClassCastException exception) {
// do something
}
}
});
}
public static interface AdapterCallback {
void onMethodCallback();
}
}
礼貌: Call Activity method from adapter
final Dialog dialog = new Dialog(your_activity_context);
您正在使用 context
,它是 null,因此在 ViewHolder
构造函数和 CBAdapter[ 中传递 context
=22=] 构造函数也如下所示:
public class CBAdapter extends RecyclerView.Adapter<CBAdapter.ViewHolder> {
List<AdapterData> mItems;
Context context;
public CBAdapter(Context context) {
super();
this.context = context;
.....
}
并且在ViewHolder中class
class ViewHolder extends RecyclerView.ViewHolder{
public TextView textOne;
private Context mcontext;
public ViewHolder(View itemView, Context mcontext) {
super(itemView);
this.mcontext = mcontext;
....
}
编写此代码:
final Dialog dialog = new Dialog(CBAdapter.this);
而不是
final Dialog dialog = new Dialog(context);
(或)
context = CBAdapter.this; // Initialize context
希望对您有所帮助。
快乐编码:)
没关系我忘了初始化我的上下文
上下文=itemView.getContext();
与问题没有直接关系,尽管我请求你:不要在适配器中设置 onClickListener-s!
应该这样做:
private class ItemDataHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener{
private final String TAG = ItemDataHolder.class.getSimpleName();
/**
* Define view's elements
*/
/**
* Define object instance
*/
private Item mData;
// Constructor
public MessageDataHolder(View itemView) {
super(itemView);
/**
* Init elements
*/
itemView.setOnLongClickListener(this);
}
/**
* Method to handle long click on the item
* @param v View to handle click on
* @return
*/
@Override
public boolean onLongClick(View v) {
Log.v(TAG, "Long click fired!");
return false;
}
/**
* Function to update view's elements
* @param message Good data to be updated to
*/
public void bindData(Item message) {
mData = message;
/**
* Set values of views here
**/
}
}
希望我的回答能帮助别人写出更好的代码:)
我正在使用 RecyclerView
列出一些文本,现在我想这样当用户单击文本时会弹出一个自定义警报对话框。
到目前为止我已经试过了但是得到了一个 NullPointerException;这里可能有什么问题?
public class CBAdapter extends RecyclerView.Adapter<CBAdapter.ViewHolder> {
List<AdapterData> mItems;
public CBAdapter() {
super();
mItems = new ArrayList<>();
AdapterData data = new AdapterData();
data.setTextOne("Many Bows");
mItems.add(data);
data = new AdapterData();
data.setTextOne("Pardon");
mItems.add(data);
data = new AdapterData();
data.setTextOne("Fall To Knees & Beg");
mItems.add(data);
data = new AdapterData();
data.setTextOne("Backflips");
mItems.add(data);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.test3, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
AdapterData data = mItems.get(i);
viewHolder.textOne.setText(data.getTextOne());
}
@Override
public int getItemCount() {
return mItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
public TextView textOne;
private Context context;
public ViewHolder(View itemView) {
super(itemView);
textOne = (TextView)itemView.findViewById(R.id.textView1);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.custom_dialog);
dialog.setTitle("Title");
TextView text = (TextView) dialog.findViewById(R.id.text);
text.setText("hello world");
ImageView image = (ImageView) dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher);
Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK);
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
});
}
}
}
这不是您查询的答案,而是处理这种情况的更好方法。
Use callback methods.
在你的Activity中:
这将实现我们 Adapter
中的接口。在此示例中,当用户单击 RecyclerView
.
public class MyActivity extends Activity implements AdapterCallback {
private MyAdapter mMyAdapter;
@Override
public void onMethodCallback() {
// Show your alert
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mMyAdapter = new MyAdapter(this);
}
}
在您的适配器中:
在 Activity 中,我们启动了 Adapter
并将其作为参数传递给构造函数。这将为我们的回调方法启动我们的接口。可以看到我们使用了我们的用户点击回调方法。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private AdapterCallback mAdapterCallback;
public MyAdapter(Context context) {
try {
this.mAdapterCallback = ((AdapterCallback) context);
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement AdapterCallback.");
}
}
@Override
public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) {
// simple example, call interface here
// not complete
viewHolder.itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
mAdapterCallback.onMethodCallback();
} catch (ClassCastException exception) {
// do something
}
}
});
}
public static interface AdapterCallback {
void onMethodCallback();
}
}
礼貌: Call Activity method from adapter
final Dialog dialog = new Dialog(your_activity_context);
您正在使用 context
,它是 null,因此在 ViewHolder
构造函数和 CBAdapter[ 中传递 context
=22=] 构造函数也如下所示:
public class CBAdapter extends RecyclerView.Adapter<CBAdapter.ViewHolder> {
List<AdapterData> mItems;
Context context;
public CBAdapter(Context context) {
super();
this.context = context;
.....
}
并且在ViewHolder中class
class ViewHolder extends RecyclerView.ViewHolder{
public TextView textOne;
private Context mcontext;
public ViewHolder(View itemView, Context mcontext) {
super(itemView);
this.mcontext = mcontext;
....
}
编写此代码:
final Dialog dialog = new Dialog(CBAdapter.this);
而不是
final Dialog dialog = new Dialog(context);
(或)
context = CBAdapter.this; // Initialize context
希望对您有所帮助。
快乐编码:)
没关系我忘了初始化我的上下文
上下文=itemView.getContext();
与问题没有直接关系,尽管我请求你:不要在适配器中设置 onClickListener-s!
应该这样做:
private class ItemDataHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener{
private final String TAG = ItemDataHolder.class.getSimpleName();
/**
* Define view's elements
*/
/**
* Define object instance
*/
private Item mData;
// Constructor
public MessageDataHolder(View itemView) {
super(itemView);
/**
* Init elements
*/
itemView.setOnLongClickListener(this);
}
/**
* Method to handle long click on the item
* @param v View to handle click on
* @return
*/
@Override
public boolean onLongClick(View v) {
Log.v(TAG, "Long click fired!");
return false;
}
/**
* Function to update view's elements
* @param message Good data to be updated to
*/
public void bindData(Item message) {
mData = message;
/**
* Set values of views here
**/
}
}
希望我的回答能帮助别人写出更好的代码:)