如何使用 Dialogfragment 和 ArrayAdapter 创建列表对话框以填充 Java class 中的项目?

How to create a list dialog using Dialogfragment and ArrayAdapter to populate items from Java class?

我自己正在学习 DialogFragments。除了从按钮传递意图外,我从未尝试过任何其他方法,所以我没有找到正确的方向。

我想学习所有可能的方法。

它与使用 ListFragment 创建列表有什么不同吗?

主 Activity 上有 2 个按钮。单击第二个按钮时,它应该打开一个带有项目列表的 DialogFragment,单击一个列表项目应该在浏览器中打开 URL。

主要Activity

btnDepartment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Intent intent = new Intent(MainActivity.this, DepartmentActivity.class);
                //startActivity(intent);

            }

        });

这里是部门Class,是纯Javaclass

public class Department {
    private String deptName, deptUrl;


    public static final Department[] myDepartment = {

            new Department("CS", "http://cs.com"),
            new Department("Biology", "http://bio.com"),
            new Department("Chemistry", "http://www.chemistry.com"),
            new Department("Nursing", "http://nursing.com")
    };

    private Department(String deptName, String deptUrl){
        this.deptName = deptName;
        this.deptUrl = deptUrl;

    }

    public String getDeptName() {
        return deptName;
    }

    public String getDeptUrl() {
        return deptUrl;
    }

    @Override
    public String toString() {
        return deptName;
    }

}

部门片段

public class DepartmentFragment extends DialogFragment {

    public DepartmentFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_department, container, false);
    }

}

Is [creating a DialogFragment] different than creating list with ListFragment

简单地说:是的。

为什么?因为 ListFragment 使您可以访问 getListView()setAdapter() 以及 class 的实例方法。

为了对不从 ListFragment 扩展的任何其他片段 class 执行此操作,您必须使用 ListView 声明一些 XML 布局并执行某些操作像这样

我假设 fragment_department.xml 包含 @+id/listListView 元素,并且您不关心部门信息的显示方式。

public class DepartmentFragment extends DialogFragment {

    public DepartmentFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_department, container, false);

        ListView lstView = (ListView) rootView.findViewById(R.id.list);

        ArrayAdapter<Department> adapter = new ArrayAdapter<Department>(getActivity(), android.R.layout.simple_list_item_1, Department.myDepartment);
        lstView.setAdapter(adapter);

        // TODO: adapter.setOnItemClickListener 
        //    ... handle click
        //    ... load webpage

        return rootView;
    }

}

首先,您的模型必须实现 Parcelable:

public class Department implements Parcelable {
    private String deptName, deptUrl;


    public static final Department[] myDepartment = {

            new Department("CS", "http://cs.com"),
            new Department("Biology", "http://bio.com"),
            new Department("Chemistry", "http://www.chemistry.com"),
            new Department("Nursing", "http://nursing.com")
    };

    private Department(String deptName, String deptUrl){
        this.deptName = deptName;
        this.deptUrl = deptUrl;

    }

    protected Department(Parcel in) {
        deptName = in.readString();
        deptUrl = in.readString();
    }

    public static final Creator<Department> CREATOR = new Creator<Department>() {
        @Override
        public Department createFromParcel(Parcel in) {
            return new Department(in);
        }

        @Override
        public Department[] newArray(int size) {
            return new Department[size];
        }
    };

    public String getDeptName() {
        return deptName;
    }

    public String getDeptUrl() {
        return deptUrl;
    }

    @Override
    public String toString() {
        return deptName;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(deptName);
        parcel.writeString(deptUrl);
    }
}

之后,必须实现方法:

btnDepartment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DepartmentFragment departmentFragment = DepartmentFragment.newInstance(department);
                departmentFragment.show(getSupportFragmentManager(), "departmentFragment");
            }

        });

片段如下:

public class DepartmentFragment extends DialogFragment {

    private Department department;

    public DepartmentFragment() {
        // Required empty public constructor
    }

    public static DepartmentFragment newInstance(Department department) {
        DepartmentFragment f = new DepartmentFragment();

        // Supply num input as an argument.
        Bundle extras = new Bundle();
        args.putParcelable("department", department);
        f.setArguments(args);

        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        department = getArguments().getParcelable("department")
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_department, container, false);
    }

}

此外,您可以在 http://developer.android.com/reference/android/app/DialogFragment.html

查看所有信息