android如何显示包含对象列表的片段
这是在主要活动中,允许用户单击按钮创建包含productArray数据的片段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"
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);
}
}