【问题标题】:How to create a list dialog using Dialogfragment and ArrayAdapter to populate items from Java class?如何使用 Dialogfragment 和 ArrayAdapter 创建列表对话框以填充 Java 类中的项目?
【发布时间】:2016-10-03 22:28:57
【问题描述】:

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

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

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

主 Activity 上有 2 个按钮。单击第二个按钮时,它应该会打开一个包含项目列表的 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);
    }

}

【问题讨论】:

    标签: android listview android-fragments android-dialogfragment


    【解决方案1】:

    [创建 DialogFragment] 与使用 ListFragment 创建列表是否不同

    简单地说:是的。

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

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

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

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

    【讨论】:

      【解决方案2】:

      首先,您的模型必须实现 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查看所有信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-16
        • 1970-01-01
        • 1970-01-01
        • 2019-10-01
        • 2017-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多