#android #json #okhttp
Вопрос:
Здравствуйте, мне нужна помощь. Я получаю данные json из новостного api и пытаюсь заполнить представление переработчика. Проблема, с которой я сталкиваюсь, заключается в том, что он хорошо извлекает json, но при заполнении моего представления переработчика он отображает один объект json несколько раз из одного источника новостей снова и снова вместо отображения разных новостей из разных источников новостей. Вот мой метод, который извлекает данные
public void fetchNewsData() {
client = new OkHttpClient();
final MediaType JSON
= MediaType.get("application/json; charset=utf-8");
request = new Request.Builder().url("https://newsapi.org/v1/sources?apiKey=" apiKey).get().build();
client.newCall(request).enqueue(new Callback() {
public Response intercept(Interceptor.Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
ResponseBody body = response.body();
bodyString = body.string();
MediaType contentType = body.contentType();
Log.d("Response", bodyString);
return response.newBuilder().body(ResponseBody.create(contentType, bodyString)).build();
}
//fetching json data well
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
} // transmission failure callback
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
final String string = response.body().string();
Log.i("cheese", "onResponse: " string);
runOnUiThread(new Runnable() {
@Override
public void run() {
//Snackbar.make(v,string,Snackbar.LENGTH_LONG).show();
try {
NewsItem singleNewsItem = new NewsItem();
JSONObject main = new JSONObject(string);
JSONArray jsonArray = main.getJSONArray("sources");
for(int i=0;i<jsonArray.length();i ){
JSONObject jsonObject = jsonArray.getJSONObject(i);
Log.i("json fetched",jsonObject.toString());
singleNewsItem.setSourceName(jsonObject.getString("name"));
singleNewsItem.setDescription(jsonObject.getString("description"));
singleNewsItem.setUrl(jsonObject.getString("url"));
singleNewsItem.setCountry(jsonObject.getString("country"));
newsItems.add(singleNewsItem);
}
} catch (JSONException e) {
e.printStackTrace();
}
mAdapter = new MyAdapter(newsItems, LatestNews.this);
mRecyclerView.setAdapter(mAdapter);
}
});
}
Вот мой класс адаптера для представления переработчика
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<NewsItem> newsItemList;
private Context mContext;
public MyAdapter(List itemList, Context context) {
this.newsItemList = itemList;
this.mContext = context;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
// Return a new view holder
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.itemView.setTag(newsItemList.get(position));
NewsItem item = newsItemList.get(position);
holder.txtName.setText(item.getSourceName());
holder.txtUrl.setText(item.getUrl());
holder.txtDescription.setText(item.getDescription());
holder.txtCattegory.setText(item.getCategory());
}
@Override
public int getItemCount() {
return newsItemList.size();
}
// View holder class whose objects represent each list item
public static class MyViewHolder extends RecyclerView.ViewHolder {
public TextView txtName;
public TextView txtUrl;
public TextView txtDescription;
public TextView txtCattegory;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
txtName = itemView.findViewById(R.id.txtName);
txtUrl = itemView.findViewById(R.id.txtUrl);
txtDescription = itemView.findViewById(R.id.txtDescription);
txtCattegory = itemView.findViewById(R.id.txtCattegory);
}
public void bindData(NewsItem dataModel, Context context,int i) {
}
}
}
Ответ №1:
Вы singleNewsItem
должны построить в for loop
новость, которую вы видите, вероятно, последняя, потому что вы добавляете то же singleNewsItem
самое в list
. Это означает, что элементы вашего списка ссылаются на один и тот же адрес памяти.
Комментарии:
1. большое вам спасибо, что сработало. потрясающе, спасибо за вашу помощь