【问题标题】:Refresh RecyclerView fragment from another fragment's adapter从另一个片段的适配器刷新 RecyclerView 片段
【发布时间】:2018-10-11 10:21:50
【问题描述】:

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

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

如果我理解正确,我应该从ShopProductAdapter 调用WishlistProductAdapter,但我是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);

编辑:

Shop.java除了for循环(片段)是一样的:

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

非常感谢任何帮助!

【问题讨论】:

  • 您应该为 ShopFragment 和 WishlistFragment 提供代码。这些怎么关联? ShopFragment 中是否有对 WishlistFragment 的引用?
  • 添加了商店片段代码。不,两者之间没有关系,wishlist_products 存储在 SharedPreferences 中。两个片段都像这样初始化:SectionsStatePagerAdapter adapter = new SectionsStatePagerAdapter(getSupportFragmentManager()); adapter.addFragment(new Shop(), "Shop"); adapter.addFragment(new MyWishlist(), "My Wishlist"); viewPager.setAdapter(adapter);

标签: android android-fragments arraylist android-recyclerview


【解决方案1】:

片段应该通过父 Activity 相互通信。两个 Fragment 永远不应该直接通信。

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

所以,你可以做的是在片段A中创建一个接口。在活动中实现这个接口。点击按钮,调用接口的方法。在实现了这个接口的activity中,你可以获得对fragment B的引用。你可以在fragment B中创建一个方法,在这个方法中你可以调用适配器上的notifyDataSetChanged()。

上面的粗略代码怎么做 -

在片段B中创建一个方法

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

在 Fragment A 中创建接口

   interface RefreshInterface{
            public void refreshAdapterFragmentB();
   }

ParentActivity实现了RefreshInterface,你需要定义refreshAdapterFramgentB()方法的实现,fragmentB是对你在activity中的fragment B的引用。可以这样调用fragment B的refreshAdapter()方法

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

【讨论】:

  • 感谢 Kashish 的回复。我不知道该怎么做,您介意分享一个关于如何获取片段 B 的引用并在其中创建方法的小示例代码吗?
  • 谢谢!我会试试然后回复你
  • 我没看懂最后一段...我应该在 MainActivity 中添加什么?已经implements NavigationView.OnNavigationItemSelectedListener
  • 我添加了implements RefreshInterface,但它抛出了一个错误:{ 预期
  • 好的,我必须制作 Shop.RefreshInterface
【解决方案2】:

使用比 Kashish 建议的更简单的解决方案,从两个片段共享的列表中的另一个片段添加后,我终于能够在“我的愿望清单”片段中显示产品(使用 SharedPreferences)。

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

    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

P.S.:非常感谢 @Kashish Malhotra 的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多