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

Pass object from GridView of Fragment to ListView of another Fragment

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

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

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

Bundle 对象从 ProductGridAdapter(在 FragmentA 下)发送,接收者将是 FragmentB,其中 FragmentB 将为 FragmentA 添加的最新对象更新 ListView

这是我的代码:

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

您可以在接口 class 和 main activity 中有两个常用方法,以更新两个片段中的视图,当 FragmentA 中发生某些更改时,您必须通知 main activity 然后 main activity 应该与 FragementB 沟通 changes.try 这样做,希望这将有助于 you.Happy 编码!