在调用notifyDataSetChanged()时,Recyclerview不会重新加载数据

时间:2016-05-18 13:16:05

标签: android android-fragments android-recyclerview

我在我的应用程序中使用了回收站视图。我正在初始化onActivity内部的适配器和回收器视图,如下所示,

adapter = new CardsRecyclerAdapterInternal(WalletStoreFragment.this);
        cardSummaryList = new ArrayList<LoyaltyCardSummary>();
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setHasFixedSize(true);

现在我正在调用API来为Recycler视图加载数据。这是我的层次结构

片段 - &gt;片段演示者 - &gt; API层

所以我的片段在presenter中调用一个方法,该方法又调用API。 API将数据返回给演示者。我正在使用EventBus。

该片段实现了下面给出的接口,

public interface StoreView
    {
        void reloadCardList (List<CardSummary> cards);
        void dismissCardLoad();
    }

Presenter使用下面给出的代码调用接口方法重新加载回收器视图数据。

@Override
    public void reloadCardList(final List<CardSummary> cards)
    {
        cardSummaryList.clear();
        cardSummaryList.addAll(cards);
        adapter.notifyDataSetChanged();
        recyclerView.invalidate();
    }

以下是适配器的代码

public class CardsRecyclerAdapterInternal extends
            RecyclerView.Adapter<CardsRecyclerAdapterInternal.ViewHolder>
    {

        private Fragment frag;

        public CardsRecyclerAdapterInternal()
        {
            //this.frag = _frag;
        }

        public void setCardSummaryList(List<CardSummary> cards)
        {
            //this.cardSummaryList = cards;
        }


        @Override
        public CardsRecyclerAdapterInternal.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            Context context = parent.getContext();
            LayoutInflater inflater = LayoutInflater.from(context);

            // Inflate the custom layout
            View view = inflater.inflate(R.layout.fragment_wallet_store_item, parent, false);

            // Return a new holder instance
            ViewHolder viewHolder = new ViewHolder(view);
            return viewHolder;
        }

        @Override
        public void onBindViewHolder(CardsRecyclerAdapterInternal.ViewHolder holder, int position) {

            CardSummary card = cardSummaryList.get(position);
            holder.txt_CardName.setText(card.getCardName());
            holder.txt_CardCategory.setText(card.getCardCategory());
            String cardURL = Global.CARD_IMAGE + Uri.encode(card.getCardImage());
            Glide
                    .with(WalletStoreFragment.this)
                    .load(cardURL)
                    .into(holder.cardImage);
        }

        @Override
        public int getItemCount() {
            return cardSummaryList.size();
        }

        public  class ViewHolder extends RecyclerView.ViewHolder {

            TextView txt_CardName;
            TextView txt_CardCategory;
            ImageView cardImage;

            public ViewHolder(View convertView) {
                super(convertView);
                txt_CardName = (TextView)convertView.findViewById(R.id.txt_CardName);
                txt_CardCategory = (TextView)convertView.findViewById(R.id.txt_CardCategory);
                cardImage = (ImageView)convertView.findViewById(R.id.img_CardImage);


            }
        }
    }

但这不是在回收站视图中重新加载数据。甚至没有在recycler视图中调用getItemCount()。这里出了什么问题?

****************************更新****************** ******

我对我的问题有更多的意见。我有一个标签式视图寻呼机应用程序,当单击一个按钮时,从其中一个选项卡加载回收器视图。如果我直接在主TabPage中加载回收器视图片段一切正常,但当它在另一个视图中时,回收器没有重新加载。这是我加载新片段的方法,

FragmentManager manager = getFragmentManager();
                Fragment fragment = new StoreFragment();
                manager.beginTransaction()
                        .add(R.id.container, fragment)
                        .addToBackStack("STORE_FRAGMENT")
                        .commit();

这是我在XML文件中的容器,

<FrameLayout android:id="@+id/container" android:layout_width="match_parent"
                 android:layout_height="match_parent"/>

由于

1 个答案:

答案 0 :(得分:0)

变量(List)cardSummaryList未在Adapter类中的任何位置声明。所以cardSummaryList.size();不会返回任何内容,如果有的话,它应该引发NullPointerException。 您需要通过以下方式更改您的适配器代码:包括本地变量List<CardSummary> cardSummaryList;,然后创建一个构造函数,将List作为其参数之一 -

private List<CardSummary> cardSummaryList;
....
public CardsRecyclerAdapterInternal(List<CardSummary> cardsList)
{
 cardSummaryList = cardsList;
}

你还应该添加一个更新列表的方法(称之为reloadCards(List<CardSummary> cards),然后这个方法的主体是这样的:

public void reloadCards(List<CardSummary> cards){ 
    cardSummaryList.clear();       
    cardSummaryList.addAll(cards);
}

最后,您将reloadCardList(final List<CardSummary> cards)代码更改为:

public void reloadCardList(final List<CardSummary> cards)
    {        
        adapter.reloadCards(cards);
        adapter.notifyDataSetChanged();
        recyclerView.invalidate();
    }

请尝试一下,如果这可以帮助您解决问题,请告诉我。 顺便说一句,请查看how to use RecyclerView的示例 - 您还可以在Creating Lists and Cards上查看教程