【问题标题】:Calling setAdapter on Fragment (Recycler View) not working在片段(回收器视图)上调用 setAdapter 不起作用
【发布时间】:2017-05-19 12:47:47
【问题描述】:

我尝试在片段上设置适配器,但没有任何显示。

对象从 API 检索数据,但不显示在屏幕上。

我已经在rvItem.setAdapter(mainAdapter); 上设置了断点,但什么也没发生,调试直接通过。


public class ItemFragment extends Fragment {

private MainAdapter mainAdapter;
private ItemPresenter itemPresenter;
private GridLayoutManager mLayoutManager;
private List<ObjectAdapter> list = new ArrayList<>();


private String region = "br";


@Bind(R.id.rvItem)
RecyclerView rvItem;

public ItemFragment() {
    // Required empty public constructor

}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_item, container, false);
    ButterKnife.bind(this, view);
    itemPresenter = new ItemPresenter();
    mLayoutManager = new GridLayoutManager(getActivity(), 4);
    rvItem.setLayoutManager(mLayoutManager);

    getList();

    return view;

}

private void getList() {
    itemPresenter.loadItemList(region, "all", AppConfigs.api_key, new ItemListListener() {
        @Override
        public void onRequestStarted() {
        }

        @Override
        public void onRequestFinished() {

        }

        @Override
        public void onError(Throwable error) {

        }

        @Override
        public void onItemListLoad(List<ItemDto> itemList) {

            displayItemList(ObjectAdapter.convertItemToObjetct(itemList));


        }
    });

}

public void displayItemList(List<ObjectAdapter> itemList) {
    list = itemList;

    mainAdapter = new MainAdapter(getActivity(), list, new MainAdapter.OnObjectClickListener() {
        @Override
        public void OnObjectClickListener(ObjectAdapter objectAdapter) {
            Toast.makeText(getActivity(), "Object Adapter" + objectAdapter.Id, Toast.LENGTH_SHORT).show();
        }
    });

    rvItem.setAdapter(mainAdapter);
    mainAdapter.notifyDataSetChanged();

}

}

适配器:

public class MainAdapter extends                    
RecyclerView.Adapter<MainAdapter.MainAdapterViewHolder>  {

public List<ObjectAdapter> mObjecterList;
private final OnObjectClickListener listener;
private Context mContext;


public interface OnObjectClickListener {
    void OnObjectClickListener(ObjectAdapter objectAdapter);
}


public MainAdapter(Context context, List<ObjectAdapter> objectAdapterList, OnObjectClickListener listener) {
    this.mObjecterList = objectAdapterList;
    this.listener = listener;
    this.mContext = context;
}

@Override
public MainAdapter.MainAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_main_adapter, parent, false);

    return new MainAdapterViewHolder(view);
}

@Override
public void onBindViewHolder(MainAdapter.MainAdapterViewHolder holder, int position) {
    ObjectAdapter ob = mObjecterList.get(position);

    holder.tvNameText.setText(ob.Name);
    holder.bind(mObjecterList.get(position), listener);

    String url = "";
    switch (ob.Type){

        case CHAMPION: url = String.format(AppConfigs.portraitChampion, ob.Portrait);
            break;
        case SPELL: url = String.format(AppConfigs.portraitSpell, ob.Portrait);
            break;
        case ITEM: url = String.format(AppConfigs.portraitItem, ob.Portrait);
            break;
    }

    Picasso.with(mContext).load(url).into(holder.ivRetrato);

}

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

public static class MainAdapterViewHolder extends RecyclerView.ViewHolder {

    public TextView tvNameText;
    public ImageView ivRetrato;

    public MainAdapterViewHolder(View itemView) {
        super(itemView);

        this.tvNameText = (TextView) itemView.findViewById(R.id.tvNameText);
        this.ivRetrato = (ImageView) itemView.findViewById(R.id.ivImagePortrait);
    }

    public void bind(final ObjectAdapter  objectAdapterListItem, final OnObjectClickListener listener) {
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.OnObjectClickListener(objectAdapterListItem);
            }
        });
    }
}
}

【问题讨论】:

  • 只需检查您的onItemListLoad() 是否确实获得了列表,并检查您是否从ObjectAdapter.convertItemToObjetct(itemList) 获得列表
  • 请检查您的适配器是否为空
  • onItemListLoad() 正在获取列表,但我认为问题出在适配器上。
  • 调试代码时,应用在displayItemList上不输入,而是显示itemList的大小

标签: android android-studio android-fragments android-recyclerview android-adapter


【解决方案1】:

需要在onCreateView方法直接设置adapter,加载数据时调用adapter的notifyDataSetChanged()

【讨论】:

  • 我刚试过这个,但是notifyDataSetChanged() 是空的,就像适配器一样。
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多