从自定义 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);