从另一个片段的适配器刷新RecyclerView片段

时间:2018-05-01 11:12:05

标签: android android-fragments arraylist android-recyclerview

我正在制作一个连接到WordPress的Android电子商务应用。在我的应用程序中,我有两个片段商店片段(从其中的网站获取产品)和我的心愿单片段(包含心愿单产品)在里面)。我还有两个列表:一个用于检索到的产品,另一个用于 wishlist产品。 wishlist产品列表包含检索到的产品列表中的每个产品索引,因此我可以稍后获得完整的详细信息(图像,描述等)。

我面临的问题是在将产品添加到心愿单时,我希望能够点击商店片段中的心愿单按钮,愿望清单产品会显示在我的心愿单中片段即可。我在网上搜索了很多,我发现我应该使用notifyDataSetChanged,但我没有找到任何关于如何从其他片段调用它的例子。

如果我理解正确,我应该从WishlistProductAdapter拨打ShopProductAdapter,但我是Android开发的初学者,所以我不确定我是否可以自行解决这个问题。

我相信这段代码位于 MyWishlist.java (片段)中,可以提供帮助:

//getting the recyclerview from xml
RecyclerView recyclerView = (RecyclerView) getView().findViewById(R.id.wishlist_products);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(getResources().getInteger(R.integer.products_column_count), StaggeredGridLayoutManager.VERTICAL));

JSONArray shop_products = //fetched from website, done in MainActivity;
ArrayList<String> wishlist_products = ["3","0"]; // It contains product of index 0 and product of index 3 inside shop_products
//initializing the productlist
List<Product> productList = new ArrayList<>();

for (int i=0; i<wishlist_products.size(); i++) {
    String index = wishlist_products.get(i);
    JSONObject JO = (JSONObject) shop_products.get(Integer.parseInt(index));

    productList.add(
            new Product(
                    i,                                            //index
                    Integer.parseInt(JO.get("id").toString()),    //id
                    JO.get("title").toString(),                   //title
                    null,
                    null,
                    JO.get("price").toString(),                   //price
                    JO.get("featured_image_url").toString(),      //image_url
                    null
            )
    );
}
//creating recyclerview adapter
adapter = new WishlistProductAdapter(getActivity().getApplicationContext(), productList);

//setting adapter to recyclerview
recyclerView.setAdapter(adapter);

编辑:

除了for循环(片段)之外,

Shop.java 是相同的:

for (int i=0; i<shop_products.length(); i++) {
    JSONObject JO = (JSONObject) shop_products.get(i);

    productList.add(
        new Product(
            i,
            Integer.parseInt(JO.get("id").toString()),
            JO.get("title").toString(),
            null,
            null,
            JO.get("price").toString(),
            JO.get("featured_image_url").toString(),
            null
        )
    );
}

编辑:

包含片段,适配器和MainActivity的代码在此处:https://ufile.io/25z9e

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

片段应通过父Activity进行相互通信。两个碎片永远不应该直接沟通。

设A是要从片段B调用适配器的notifyDataSetChanged()的片段。

因此,您可以做的是在片段A中创建一个接口。在活动中实现此接口。单击该按钮,调用界面的方法。在实现此接口的活动中,您可以获得对片段B的引用。您可以在片段B中创建一个方法,您可以在该方法上调用适配器上的notifyDataSetChanged()。

粗略代码上面怎么做 -

在片段B中创建一个方法

    public void refreshAdapter(){
             adapter.notifyDataSetChanged();
    }

在Fragment A中创建一个接口

   interface RefreshInterface{
            public void refreshAdapterFragmentB();
   }

ParentActivity实现RefreshInterface,您需要定义refreshAdapterFramgentB()方法的实现,fragmentB是您在活动中对片段B的引用。您可以像这样调用片段B的refreshAdapter()方法

    @Override 
    public void refreshAdapterFragmentB(){
            fragmentB.refreshAdapter();
    }

答案 1 :(得分:0)

在使用比Kashish建议的解决方案更简单的解决方案从两个片段(使用SharedPreferences)共享的List中的其他片段添加后,我终于能够在My Wishlist fragement中显示产品。

  1. 我首先在onPageSelected内添加了一个MainActivity侦听器,如下所示:

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        public void onPageScrollStateChanged(int state) {}
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
    
        @Override
        public void onPageSelected(int position) {
            NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
            navigationView.setNavigationItemSelectedListener(MainActivity.this);
    
            if(position == 0) {
                setSelectedNavItem(0);
                myShop.refreshAdapter();
            } else if (position == 1) {
                setSelectedNavItem(2);
                myWishList.refreshAdapter();
            }
        }
    });
    
  2. 在每个片段中,我添加了refreshAdapter()方法,如下所示:

    public void refreshAdapter() {
        if(productList != null) {
            adapter.productList = productList;
            adapter.notifyDataSetChanged();
        }
    }
    
  3. 我在每个片段的适配器中全局化了productList
  4. P.S。:非常感谢你@Kashish Malhotra的帮助!

相关问题