从自定义 ArrayAdapter 内部关闭对话框
Closing dialog from inside a custom ArrayAdapter
我有一个自定义对话框片段,其中有一个自定义 ArrayAdapter。每个列表项都有 3 个按钮。在单击每个按钮时,我有一个 OnClickListener()
执行一个功能。功能完成后,我需要关闭对话框。因为这是在 ArrayAdapter 中完成的,所以我不能像在对话框片段中那样调用 dismiss()
。我尝试为对话框片段内的按钮设置一个 OnClickListener()
,但我得到一个空指针。
我不知道如何从自定义 arrayAdapter 中获取对对话框片段的引用。 onclick 事件必须在 ArrayAdapter 内部发生,因为它使用特定于该列表项的信息。任何帮助将不胜感激。谢谢。
对话框片段:
public class SavedArmyDialog extends DialogFragment {
View mView;
public static SavedArmyDialog newInstance() {
SavedArmyDialog fragment = new SavedArmyDialog();
return fragment;
}
public SavedArmyDialog() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
mView = inflater.inflate(R.layout.custom_army_list, container, false);
CustomArmyObjData customArmyObjData = new CustomArmyObjData();
ArrayList<CustomArmy> customArmyArray = customArmyObjData.getCustomArmyArray(getActivity());
CustomArmyAdapter adapter = new CustomArmyAdapter(getActivity(), customArmyArray);
ListView armyList = (ListView) mView.findViewById(R.id.armyListView);
armyList.setAdapter(adapter);
return mView;
}
}
自定义数组适配器:
public View getView(int position, View convertView, ViewGroup parent) {
final CustomArmy army = getItem(position);
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(getContext()).inflate(R.layout.individual_army_view, parent, false);
holder.armyname = (TextView) convertView.findViewById(R.id.army_name_value);
holder.townHall = (TextView) convertView.findViewById(R.id.townHallValue);
holder.armyType = (TextView) convertView.findViewById(R.id.armyTypeValue);
holder.loadButton = (Button) convertView.findViewById(R.id.loadButton);
holder.deleteButton = (Button) convertView.findViewById(R.id.deleteButton);
holder.gridLayout = (GridLayout) convertView.findViewById(R.id.armyGrid);
buildArmyCountAndIconViews(army, holder.gridLayout);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
holder.gridLayout.removeAllViews();
buildArmyCountAndIconViews(army, holder.gridLayout);
}
holder.armyname.setText(army.getName());
holder.townHall.setText(army.getTownHallRequired());
holder.armyType.setText(army.getArmyType());
holder.loadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBus.post(new LoadNewArmy(army));
Toast.makeText(getContext(), "Woking Button", Toast.LENGTH_SHORT).show();
//need to close the dialog from here
}
});
holder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Utilities.deleteCustomArmy(army.getName(), getContext());
Toast.makeText(getContext(), "Army has Been Deleted", Toast.LENGTH_LONG).show();
//need to close the dialog from here
}
});
return convertView;
}
I cannot figure out how to get a reference to the dialog fragment from
inside the custom arrayAdapter
DialogFragment also has a dismiss ()方法,关闭时需要调用DialogFragment
.
在你的情况下这样做:
1. 向 CustomArmyAdapter
添加一个参数 class 类型为 SavedArmyDialog
的构造函数:
private SavedArmyDialog objSavedArmyDialog;
public CustomArmyAdapter(SavedArmyDialog objSavedArmyDialog,...){
this.objSavedArmyDialog=objSavedArmyDialog;
....
}
2. 现在 class objSavedArmyDialog.dismiss()
在 Button 的 onClick
内:
public void onClick(View v) {
....
//need to close the dialog from here
objSavedArmyDialog.dismiss();
}
3. 通过传递当前 class 上下文创建 CustomArmyAdapter
class 对象:
CustomArmyAdapter adapter=new CustomArmyAdapter(SavedArmyDialog.this,
getActivity(),
customArmyArray);
我有一个自定义对话框片段,其中有一个自定义 ArrayAdapter。每个列表项都有 3 个按钮。在单击每个按钮时,我有一个 OnClickListener()
执行一个功能。功能完成后,我需要关闭对话框。因为这是在 ArrayAdapter 中完成的,所以我不能像在对话框片段中那样调用 dismiss()
。我尝试为对话框片段内的按钮设置一个 OnClickListener()
,但我得到一个空指针。
我不知道如何从自定义 arrayAdapter 中获取对对话框片段的引用。 onclick 事件必须在 ArrayAdapter 内部发生,因为它使用特定于该列表项的信息。任何帮助将不胜感激。谢谢。
对话框片段:
public class SavedArmyDialog extends DialogFragment {
View mView;
public static SavedArmyDialog newInstance() {
SavedArmyDialog fragment = new SavedArmyDialog();
return fragment;
}
public SavedArmyDialog() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
mView = inflater.inflate(R.layout.custom_army_list, container, false);
CustomArmyObjData customArmyObjData = new CustomArmyObjData();
ArrayList<CustomArmy> customArmyArray = customArmyObjData.getCustomArmyArray(getActivity());
CustomArmyAdapter adapter = new CustomArmyAdapter(getActivity(), customArmyArray);
ListView armyList = (ListView) mView.findViewById(R.id.armyListView);
armyList.setAdapter(adapter);
return mView;
}
}
自定义数组适配器:
public View getView(int position, View convertView, ViewGroup parent) {
final CustomArmy army = getItem(position);
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(getContext()).inflate(R.layout.individual_army_view, parent, false);
holder.armyname = (TextView) convertView.findViewById(R.id.army_name_value);
holder.townHall = (TextView) convertView.findViewById(R.id.townHallValue);
holder.armyType = (TextView) convertView.findViewById(R.id.armyTypeValue);
holder.loadButton = (Button) convertView.findViewById(R.id.loadButton);
holder.deleteButton = (Button) convertView.findViewById(R.id.deleteButton);
holder.gridLayout = (GridLayout) convertView.findViewById(R.id.armyGrid);
buildArmyCountAndIconViews(army, holder.gridLayout);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
holder.gridLayout.removeAllViews();
buildArmyCountAndIconViews(army, holder.gridLayout);
}
holder.armyname.setText(army.getName());
holder.townHall.setText(army.getTownHallRequired());
holder.armyType.setText(army.getArmyType());
holder.loadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBus.post(new LoadNewArmy(army));
Toast.makeText(getContext(), "Woking Button", Toast.LENGTH_SHORT).show();
//need to close the dialog from here
}
});
holder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Utilities.deleteCustomArmy(army.getName(), getContext());
Toast.makeText(getContext(), "Army has Been Deleted", Toast.LENGTH_LONG).show();
//need to close the dialog from here
}
});
return convertView;
}
I cannot figure out how to get a reference to the dialog fragment from inside the custom arrayAdapter
DialogFragment also has a dismiss ()方法,关闭时需要调用DialogFragment
.
在你的情况下这样做:
1. 向 CustomArmyAdapter
添加一个参数 class 类型为 SavedArmyDialog
的构造函数:
private SavedArmyDialog objSavedArmyDialog;
public CustomArmyAdapter(SavedArmyDialog objSavedArmyDialog,...){
this.objSavedArmyDialog=objSavedArmyDialog;
....
}
2. 现在 class objSavedArmyDialog.dismiss()
在 Button 的 onClick
内:
public void onClick(View v) {
....
//need to close the dialog from here
objSavedArmyDialog.dismiss();
}
3. 通过传递当前 class 上下文创建 CustomArmyAdapter
class 对象:
CustomArmyAdapter adapter=new CustomArmyAdapter(SavedArmyDialog.this,
getActivity(),
customArmyArray);