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

时间:2016-10-03 22:28:58

标签: android listview android-fragments android-dialogfragment

我自己正在学习DialogFragments。我从来没有尝试过任何东西,只能从按钮传递意图,所以我没有朝着正确的方向前进。

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

是否与使用ListFragment创建列表不同?

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

主要活动

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

            }

        });

这是Department Class,它是一个纯Java类

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);
    }

}

2 个答案:

答案 0 :(得分:1)

  

[创建DialogFragment]与使用ListFragment

创建列表不同

简单地说:是的。

为什么呢?因为ListFragment允许您访问类getListView()setAdapter()以及类的实例方法。

为了对任何其他未从ListFragment扩展的Fragment类执行此操作,您必须使用ListView声明一些XML布局并执行类似的操作

我假设fragment_department.xml包含ListView的{​​{1}}元素,并且您不关心部门信息的显示方式。

@+id/list

答案 1 :(得分:1)

首先,您的模型必须实现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);
    }

}

此外,您可以在here

查看所有信息