我有Fragment
ListView
。在适配器中,我想创建一个对话框。
class ViewHolder {
...
@Override
public void onClick(View v) {
...
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
...
}
...
}
mContext
是我Context
的{{1}},我在创建适配器时保存全局。
我收到了错误。
Fragment
方法unable to add window -- token null is not for an application
不可用,以便如何获取getActivity()
的{{1}}?
答案 0 :(得分:26)
如果您有自定义适配器,请将构造函数更改为require Context
作为参数。
public CustomAdapter(Context context, List<Item> items) {
}
然后,创建一个Instance变量以通过构造函数存储上下文。
private Context mContext; //instance variable
public CustomAdapter(Context context, List<Item> items) {
//some code
this.mContext= context;
}
现在您可以在适配器的任何位置使用变量mContext
。
要创建适配器,只需从活动创建时传递'this',如果从片段创建,则传递getActivity()
。
mAdapter = new CustomAdapter(this, mArrayItems);
希望有所帮助。
答案 1 :(得分:15)
在创建适配器时,您将什么作为上下文传递?如果你不这样做,试着通过this
。更多代码也会有所帮助。
答案 2 :(得分:0)
class ViewHolder {
...
@Override
public void onClick(View v) {
...
AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
...
}
...
}
答案 3 :(得分:0)
在我的适配器列表视图
上public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.custom_list_view, null);
holder = new ViewHolder();
holder.lsNama = convertView.findViewById(R.id.lsNama);
holder.lsUid = convertView.findViewById(R.id.idPartner);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.lsUid.setText(listData.get(position).getUid());
holder.lsNama.setText(listData.get(position).getNama());
holder.lsNama.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String uid = listData.get(position).getUid().toString();
String nama = listData.get(position).getUid().toString();
Intent intent = new Intent(view.getContext(), MapsActivity.class);
Bundle bundle = new Bundle();
bundle.putString("bUid",uid);
intent.putExtras(bundle);
view.getContext().startActivity(intent);
}
});
return convertView;
}