将对象从GridView of Fragment传递到另一个Fragment的ListView

时间:2016-05-06 07:48:44

标签: java android listview android-fragments android-gridview

我在FragmentA中有一个包含所有对象的GridView。当用户点击每个对象时,这些对象将被添加到FragmentB的ListView中。

请注意,FragmentA和FragmentB并排在同一个Activity中。

我已经尝试使用Bundle将对象从FragmentA发送到FragmentB但是我被困住了,因为我不知道FragmentB将如何知道已经添加了一个新对象。

Bundle对象从ProductGridAdapter发送(在FragmentA下),接收器将是FragmentB,FragmentB将更新ListView以获取FragmentA添加的最新对象

这是我的代码:

ProductGridAdapter.java

public class ProductGridAdapter extends ArrayAdapter<Product> {

    private List<Product> productList;
    private Context context;

    public ProductGridAdapter(Context context, int resource,
                          List<Product> objects) {
        super(context, resource, objects);
        this.context = context;
        this.productList = objects;
    }

    @Override
    public int getCount() {
        return ((null != productList) ?
                productList.size() : 0);
    }

    @Override
    public Product getItem(int position) {
        return ((null != productList) ?
                productList.get(position) : null);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        LayoutInflater layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(null == view) {
            view = layoutInflater.inflate(R.layout.grid_product, null);
        }

        final Product product = productList.get(position);

        if(product != null) {
            final CardView productGridLayout = (CardView) view.findViewById(R.id.product_gridlayout);
            final TextView productName = (TextView) view.findViewById(R.id.product_name);
            final ImageView productIcon = (ImageView) view.findViewById(R.id.product_icon);

            productName.setText(product.getName());
            productIcon.setImageDrawable(product.getDrawable());

            productGridLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    FragmentB fragment = new FragmentB();
                    Bundle bundle = new Bundle();
                    bundle.putSerializable("product", product);
                    fragment.setArguments(bundle);
                }
            });
        }

        return view;
    }
}

FragmentA.java

public class FragmentA extends Fragment {

    private GridView gridView;
    private ProductGridAdapter productAdapter;

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

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

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

        gridView = (GridView) rootView.findViewById(R.id.gridview);
        productAdapter = new ProductGridAdapter(getActivity(), R.layout.fragment_product_display, getProductList());
        gridView.setAdapter(productAdapter);

        gridView.destroyDrawingCache();
        gridView.setVisibility(GridView.INVISIBLE);
        gridView.setVisibility(GridView.VISIBLE);

        return rootView;
    }
}

FragmentB.java

 public class FragmentB extends Fragment {

        private ListView listView;
        private PaymentListAdapter paymentAdapter;
        private LinearLayout button;
        private ArrayList<String> arr;

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

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

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

            listView = (ListView) rootView.findViewById(android.R.id.list);
            paymentAdapter = new PaymentListAdapter(getActivity(), R.layout.fragment_payment, getProductList());
            //  button = (LinearLayout) rootView.findViewById(R.id.payment);

            listView.setAdapter(paymentAdapter);

            Bundle bundle = this.getArguments();
            Product product = (Product) bundle.getSerializable("product");

            return rootView;
        }

1 个答案:

答案 0 :(得分:1)

你可以在主要活动的接口类中有两个常用方法,更新两个片段中的视图,当FragmentA中发生某些更改时,你必须通知主要活动的更改,然后主要活动应该与FragementB就这些更改进行通信。这样做,希望这会对你有所帮助。快乐的编码!