Вывод подробной информации о пользователе. Retrofit
У меня такая проблема: Я получаю список пользователей отсюда и вывожу их в RecyclerView. С этим проблем нет. Проблемы начинаются при попытке получить подробную информацию и пользователе путем клика по элементу RecyclerView. В активити выводится информация не того пользователя, на которого нажали, а следующего или, в некоторых случаях, вообще рандомного. Как мне кажется, я неправильно передаю id пользователя их адаптера через intent
NetworkRequest
public class NetworkRequest {
private static NetworkRequest request;
public static final String BASE_URL = "https://api.github.com/";
private Retrofit retrofit;
private NetworkRequest() {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public static NetworkRequest getRequest(){
if(request == null){
request = new NetworkRequest();
}
return request;
}
public GithubAPI getGithubApi(){
return retrofit.create(GithubAPI.class);
}
public UserAPI getUserApi(){
return retrofit.create(UserAPI.class);
}
}
Интерфейс для получения списка пользователей (GithubAPI)
public interface GithubAPI {
@GET("/users")
Call<ArrayList<GithubModel>> getGithubModel();
}
Интерфейс для получения данных об одном пользователе (UserAPI)
public interface UserAPI {
@GET("users")
Call<List<UserModel>> getUserInfo(@Query("login") String login);
}
Адаптер
public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.UsersAdapterViewHolder> {
Context context;
ArrayList<GithubModel> arrayList;
public UsersAdapter(Context context, ArrayList<GithubModel> arrayList) {
this.context = context;
this.arrayList = arrayList;
}
@NonNull
@Override
public UsersAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler_view, parent, false);
return new UsersAdapterViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final UsersAdapterViewHolder holder, int position) {
GithubModel model = arrayList.get(position);
holder.tvLogin.setText(model.getLogin());
holder.tvText.setText(model.getReposUrl());
holder.id = model.getId();
Picasso.with(context).load(model.getAvatarUrl()).into(holder.image);
}
@Override
public int getItemCount() {
return arrayList.size();
}
public class UsersAdapterViewHolder extends RecyclerView.ViewHolder {
ImageView image;
TextView tvLogin, tvText;
int id;
public UsersAdapterViewHolder(@NonNull final View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image_item_recycler_view);
tvLogin = itemView.findViewById(R.id.login_item_recycler_view);
tvText = itemView.findViewById(R.id.text_item_recycler_view);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, UserActivity.class);
intent.putExtra("login", tvLogin.getText().toString());
intent.putExtra("id", id);
context.startActivity(intent);
}
});
}
}
}
MainActivity (здесь отображается список пользователей)
public class MainActivity extends AppCompatActivity {
TextView tvLogin, tvText;
ImageView image;
RecyclerView recyclerView;
LinearLayoutManager linearLayoutManager;
UsersAdapter usersAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadUsers();
}
public void loadUsers(){
recyclerView = findViewById(R.id.recycler_view);
linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(linearLayoutManager);
tvLogin = findViewById(R.id.login_item_recycler_view);
tvText = findViewById(R.id.text_item_recycler_view);
image = findViewById(R.id.image_item_recycler_view);
NetworkRequest.getRequest()
.getGithubApi()
.getGithubModel()
.enqueue(new Callback<ArrayList<GithubModel>>() {
@Override
public void onResponse(Call<ArrayList<GithubModel>> call, Response<ArrayList<GithubModel>> response) {
ArrayList<GithubModel> githubModels = response.body();
usersAdapter = new UsersAdapter(MainActivity.this, githubModels);
recyclerView.setAdapter(usersAdapter);
}
@Override
public void onFailure(Call<ArrayList<GithubModel>> call, Throwable t) {
Toast.makeText(MainActivity.this, "Не удалось", Toast.LENGTH_SHORT).show();
}
});
}
}
UserActivity (здесь должна отображаться дополнительная информация о нажатом в RecyclerView пользователе)
public class UserActivity extends AppCompatActivity {
ImageView image;
TextView tvLogin, tvText, tv1, tv2, tv3, tv4;
String login;
int id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
image = findViewById(R.id.image_item_user);
tvLogin = findViewById(R.id.login_item_user);
tvText = findViewById(R.id.text_item_user);
tv1 = findViewById(R.id.text_view_1_item_user);
tv2 = findViewById(R.id.text_view_2_item_user);
tv3 = findViewById(R.id.text_view_3_item_user);
tv4 = findViewById(R.id.text_view_4_item_user);
//получаю логин и id пользователся на которого нажали в recyclerView
Intent intent = getIntent();
intent.getExtras();
login = intent.getStringExtra("login");
id = intent.getIntExtra("id", 0);
getUserInfo(login, id);
}
public void getUserInfo(final String string, final int id) {
NetworkRequest.getRequest()
.getUserApi()
.getUserInfo(string)
.enqueue(new Callback<List<UserModel>>() {
@Override
public void onResponse(Call<List<UserModel>> call, Response<List<UserModel>> response) {
List<UserModel> userModel = response.body();
if (userModel != null){
tvLogin.setText(userModel.get(id).getLogin());
tvText.setText(userModel.get(id).getName());
tv1.setText(userModel.get(id).getReposUrl());
tv2.setText(userModel.get(id).getGravatarId());
tv3.setText(userModel.get(id).getNodeId());
tv4.setText(userModel.get(id).getEventsUrl());
Picasso.with(UserActivity.this).load(userModel.get(id).getAvatarUrl()).into(image);
}
else
Toast.makeText(UserActivity.this, "userModel пуст", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<List<UserModel>> call, Throwable t) {
Toast.makeText(UserActivity.this, "Не удалось", Toast.LENGTH_SHORT).show();
}
});
}
}