我有一个连接到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");
}
});
}
答案 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);
成功。