RecyclerView:未连接适配器;使用改造跳过应用程序中的布局

时间:2018-09-14 07:22:48

标签: android android-recyclerview retrofit2

我有一个连接到API并从中获取一些数据的简单程序。我使用Retrofit库。有两个活动。 MainActivity包含一个RecyclerView,该UserInfoActivity显示从服务器接收的数据。如果按任何项目,应用程序将转到UserInfoActivity并显示该项目的详细信息。我的应用程序response几秒钟后崩溃,并且不显示信息。但是txtId.setText(user.getId)正确接收,但是程序给出了错误 在E/RecyclerView: No adapter attached; skipping layout行上。错误是Call<User> getUserInfo(@Path("id") int id); 实际上,当我在第二个Activity中调用MainActivity时,我的问题就开始了。

这是 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); userRequest(); } private void userRequest(){ APIInterface apiInterface= APIClient.getClient().create(APIInterface.class); retrofit2.Call<ArrayList<User>> call= apiInterface.getUsers(); call.enqueue(new Callback<ArrayList<User>>() { @Override public void onResponse(retrofit2.Call<ArrayList<User>> call, Response<ArrayList<User>> response) { if(response.isSuccessful()){ ArrayList<User> users = response.body(); setupRecycelerView(users); } } @Override public void onFailure(retrofit2.Call<ArrayList<User>> call, Throwable t) { Log.i("RETROFIT","response not successful"); } }); } private void setupRecycelerView(ArrayList<User> users){ recyclerView=findViewById(R.id.RcyView); adapter=new RecycelerAdapter(this,users); linearLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); recyclerView.setAdapter(adapter); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.setItemAnimator(new DefaultItemAnimator()); } 代码。

onBindViewHolder

这是RecycelerAdapter的{​​{1}}功能。

 public void onBindViewHolder(@NonNull UserViewHolder holder, int position) {
    final User user=values.get(position);
    holder.txtName.setText(user.getName());
    holder.txtPhone.setText(user.getPhone());
    final Intent intent=new Intent(context, UserInfoActivity.class);
    intent.putExtra("user",user);
    holder.root.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            context.startActivity(intent);
        }
    });
}

这是UserInfoActivity代码。

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_info);
    txtId=findViewById(R.id.txtId);
    txtName=findViewById(R.id.txtName);
    txtPhone=findViewById(R.id.txtPhone);
    Intent intent=getIntent();
    User user=(User)intent.getSerializableExtra("user");
    id=user.getId();
    userInfoRequest();
}
private void userInfoRequest(){
    APIInterface apiInterface= APIClient.getClient().create(APIInterface.class);
    retrofit2.Call<User> call= apiInterface.getUserInfo(id);
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            if(response.isSuccessful()){
                User user=response.body();
                Log.e("MF","ON Response");
                Log.e("MF",user.getName());
                Log.e("MF",user.getPhone());
                txtId.setText(user.getId());
                txtName.setText(user.getName());
                txtPhone.setText(user.getPhone());
            }
        }
        @Override
        public void onFailure(Call<User> call, Throwable t) {
            Log.e("MF","on failure");
        }
    });

}

1 个答案:

答案 0 :(得分:1)

之所以会这样,是因为您在服务器成功响应时/如果初始化RecyclerView。

onCreate()中初始化它(调用setupRecycelerView())。并将adapter=new RecycelerAdapter(this,users);更改为adapter=new RecycelerAdapter(this);

使RecycelerAdapter的构造函数仅接受一个参数(可能是Context) 在您的适配器中,设置一个公共方法来设置用户。

public setUserData(ArrayList<User> users) {
    this.values = users;
    notifyDataSetChanged();
}

从Retrofit的响应中调用RecycelerAdapter.setUserData(users);成功。