android如何显示包含对象列表的片段

android如何显示包含对象列表的片段,android,fragment,Android,Fragment,这是在主要活动中,允许用户单击按钮创建包含productArray数据的片段 Button b = (Button) findViewById(R.id.button); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("hi"

这是在主要活动中,允许用户单击按钮创建包含productArray数据的片段

Button b = (Button) findViewById(R.id.button);
            b.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i("hi","onClick()");
                    Fragment f = ProductListFragment.newInstance(productArray);
                    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                    ft.replace(R.id.fragment, f);
                    ft.commit();
                }
            });
导入android.support.v4.app.Fragment;
导入android.os.Bundle;
导入android.support.annotation.Nullable;
导入android.util.Log;
导入android.view.Gravity;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.GridView;
导入java.util.ArrayList;
公共类ProductListFragment扩展了片段{
私有ArrayList productArray;
公共ArrayList getProductArray(){
返回产品数组;
}
公共void setProductArray(ArrayList productArray){
this.productArray=productArray;
}
公共静态片段newInstance(ArrayList productArray){
ProductListFragment ProductListFragment=新的ProductListFragment();
setProductArray(productArray);
返回productListFragment;
}
@可空
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
GridView GridView=(GridView)充气器。充气(R.layout.product\u list\u片段,容器,false);
gridView.setNumColumns(2);
gridView.setGravity(重力中心);
setAdapter(新的CustomGridAdapter(getActivity(),getProductArray());
返回gridView;
}
}
这是一个片段类,它将productArray中的数据放入网格视图中,这在以前的测试中很好

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;

import java.util.ArrayList;

public class ProductListFragment extends Fragment{

    private ArrayList<Product> productArray;

    public ArrayList<Product> getProductArray() {
        return productArray;
    }

    public void setProductArray(ArrayList<Product> productArray) {
        this.productArray = productArray;
    }

    public static Fragment newInstance(ArrayList<Product> productArray){

        ProductListFragment productListFragment = new ProductListFragment();
        productListFragment.setProductArray(productArray);

        return productListFragment;
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        GridView gridView = (GridView) inflater.inflate(R.layout.product_list_fragment, container, false);
        gridView.setNumColumns(2);
        gridView.setGravity(Gravity.CENTER);
        gridView.setAdapter(  new CustomGridAdapter( getActivity(), getProductArray() ) );
        return gridView;
    }
}


这是activity_main.xml。我知道如果以这种方式生成片段,就会发生错误,因为productArray为null。是否需要片段标记,以便为片段保留位置或出于任何原因?如何显示新片段?请帮忙

您应该将productArray添加到bundle中,并从bundle中获取productArray,
Product
模型需要实现Parcelable

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:orientation="vertical"
              android:padding="10dp">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="open fragment"
        android:id="@+id/button"/>

    <fragment
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:name="com.it.fyp.fyprestaurant.ProductListFragment"
        android:id="@+id/fragment"/>


</LinearLayout>
私有静态最终字符串BUNDLE\u PRODUCT\u LIST=“BUNDLE\u PRODUCT\u LIST”;
公共静态片段newInstance(ArrayList productArray){
ProductListFragment ProductListFragment=新的ProductListFragment();
Bundle=新Bundle();
bundle.putParcelableArrayList(bundle\u PRODUCT\u LIST,productArray);
productListFragment.setArguments(bundle);
返回productListFragment;
} 
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
如果(getArguments()!=null){
productArray=getArguments().getParcelableArrayList(捆绑产品列表);
}
} 
========================================

更新:

可包裹示例:

private static final String BUNDLE_PRODUCT_LIST = "bundle_product_list";    

public static Fragment newInstance(ArrayList<Product> productArray){

    ProductListFragment productListFragment = new ProductListFragment();
    Bundle bundle = new Bundle();
    bundle.putParcelableArrayList(BUNDLE_PRODUCT_LIST, productArray);
    productListFragment.setArguments(bundle);
    return productListFragment;
} 

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (getArguments() != null) {
       productArray = getArguments().getParcelableArrayList(BUNDLE_PRODUCT_LIST);
    }
} 
公共类产品实现可包裹{
私有字符串id;
私有字符串名称;
公共产品(字符串id、字符串名称){
this.id=id;
this.name=名称;
}
@凌驾
公共int描述内容(){
返回0;
}
公共静态最终包裹。创建者
=新的Parcelable.Creator(){
公共产品createFromParcel(包裹中){
退回新产品(在);
}
公共产品[]新数组(整数大小){
退回新产品[尺寸];
}
};
私人产品(包裹内){
id=in.readString();
name=in.readString();
}
@凌驾
公共无效写入包裹(包裹外,内部i){
//确保writeString的顺序必须相同
//如上面构造函数的in.readString所示。
out.writeString(id);
out.writeString(名称);
}
}

如何使ArrayList可打包[]对不起,我刚刚更新到
putParcelableArrayList
以便您可以传递ArrayListimplementing Parcelable需要实现抽象方法?是的,您可以参考。如何实现这些方法。在这两个抽象中,我应该怎么做?没有什么
public class Product implements Parcelable {
    private String id;
    private String name;

    public Product(String id, String name) {
        this.id = id;
        this.name = name;
    }

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

    public static final Parcelable.Creator<Product> CREATOR
            = new Parcelable.Creator<Product>() {
        public Product createFromParcel(Parcel in) {
            return new Product(in);
        }

        public Product[] newArray(int size) {
            return new Product[size];
        }
    };

    private Product(Parcel in) {
        id = in.readString();
        name = in.readString();
    }

    @Override
    public void writeToParcel(Parcel out, int i) {
        // Make sure the order of writeString must be the same order 
        // as in.readString of the constructor above. 
        out.writeString(id);
        out.writeString(name);
    }
}