在RecyclerView中设置适配器

6

我正在尝试使用recyclerview并设置适配器,但是出现了错误:

没有连接适配器; 跳过布局 请帮助我解决这个问题

public class FragmentTwo extends Fragment {
private AppAdapter mAppAdapter;
private ArrayList<Model> mModel;
@Bind(R.id.recycler_view)
RecyclerView recyclerView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_two, container, false);
    ButterKnife.bind(this, v);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(mAppAdapter);
    parseData();
    return v;
}

 private void parseData() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("url")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    ReqInterface reqInterface = retrofit.create(ReqInterface.class);
    Call<Model> call = reqInterface.getAdvanceData("france");
    call.enqueue(new Callback<Model>() {
        @Override
        public void onResponse(Call<Model> call, Response<Model> response) {
            Model model = response.body();
            mModel = new ArrayList<Model>(Arrays.asList(model));
            mAppAdapter = new AppAdapter(mModel);
            recyclerView.setAdapter(mAppAdapter);
            mAppAdapter.notifyDataSetChanged();
        }
        @Override
        public void onFailure(Call<Model> call, Throwable t) {
        }
     });
    }
  }

这是我的RecyclerView适配器类:-
public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> {
private ArrayList<Model> mModel;
TextView highTemp;

public AppAdapter(ArrayList<Model> model) {
    mModel = model;
}

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView highTemp;
    public ViewHolder(View view) {
        super(view);
        highTemp = (TextView) view.findViewById(R.id.card_view_tv_hightemp);
    }
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.fragment_two, viewGroup, false);
    return new ViewHolder(view);

}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    viewHolder.highTemp.setText(String.valueOf(mModel.getName);
}

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

提前感谢

5个回答

4
你在运行时从未初始化适配器 mAppAdapter,所以它是空的。你需要像这样添加 mAppAdapter = new AppAdapter(yourdata); 在调用 setAdapter 之前。

感谢@Juan Cortes的回答,我已将此添加到我的parseData方法中https://onedrive.live.com/redir?resid=CDB5011499C666C7!423&authkey=!ACcY4VdFdsyGh3k&ithint=file%2c - user5201590
1
请在此处发布您的代码,抱歉我不会从OneDrive下载您的文件。 - Juan Cortés
没有适配器附加;跳过布局 @Juan Cortes - user5201590
不要在触发回调时创建新的适配器,而是将数据传递给现有的适配器,即更改构造函数以不需要数据,然后创建一个接收数据并设置数据的方法,最后通知数据集已更改。那应该可以解决问题。你首先需要一个空的适配器。 - Juan Cortés
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/110431/discussion-between-juan-cortes-and-unknownuser。 - Juan Cortés

2

您的适配器mAppAdapter从未初始化,即它为空。

因此,recyclerView.setAdapter(mAppAdapter);recyclerView.setAdapter(null);相同,因此您实际上从未设置适配器!

请记得初始化您的字段:

mAppAdapter = new AppAdapter(mModel); // or whatever constructor you want
recyclerView.setAdapter(mAppAdapter);

谢谢回复 @Blundell。我已经将这段代码添加到我的parseData方法中。https://onedrive.live.com/redir?resid=CDB5011499C666C7!423&authkey=!ACcY4VdFdsyGh3k&ithint=file,这是链接地址。 - user5201590

1
你从未创建过mAppAdapter
为了解决这个问题,需要创建一个新的适配器实例,并将其传递给.setAdapter的参数中。
换句话说,你应该使用.setAdapter(new AppAdapter(...)),其中...被你在AppAdapter中创建的参数所替代。

1
我通常在异步任务中执行retrofit调用,然后当您从服务器获取响应时,创建一个新的适配器并将其设置为recyclerview。 无论如何,请尝试从onCreate()方法中删除.setAdapter行,并将其保留为您所拥有的内容。 它可以工作而且不会崩溃,崩溃的原因是适配器为空(没有元素)。 希望能对您有所帮助!

1

改变

recyclerView.setAdapter(mAppAdapter);

recyclerView.setAdapter(new AppAdapter(model));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接