Мне нужна помощь в правильном отображении данных json в моем приложении для Android

#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. большое вам спасибо, что сработало. потрясающе, спасибо за вашу помощь