我在我的应用程序中使用了回收站视图。我正在初始化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"/>
由于
答案 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上查看教程