Я пытаюсь получить данные json из instagram api относительно определенного тега. из ответа я сохраняю все URL-адреса в пользовательский класс Image только с атрибутом String url. В каждом ответе instagram есть около 20 медиафайлов, но я не могу создать свой список изображений для отображения в моем представлении ресайклера.

Response.enqueue (new Callback () {@Override public void onResponse (Call call, Response response) {if (response.isSuccess ()) {

                mEditText.setText("secces");
                StringBuilder sb = new StringBuilder();
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(response.body().byteStream()));
                    String line;

                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                    }

                    JSONObject tagResponse = new JSONObject(sb.toString());

                    for (int i = 0; i < tagResponse.length(); i++) {
                        JSONObject pagination = tagResponse.getJSONObject("pagination");

                        mMaxId = pagination.getString("next_max_id");
                        mMinId= pagination.getString("next_min_id");

                        JSONObject meta = tagResponse.getJSONObject("meta");
                        JSONArray data = tagResponse.getJSONArray("data");

                        for (int j = 0; j < data.length(); j++) {

                            JSONArray tags = data.getJSONObject(j).getJSONArray("tags");


                            JSONObject images = data.getJSONObject(j).getJSONObject("images").getJSONObject("low_resolution");
                            mEditText.setText(images.getString("url"));

                            Picture picture = new Picture();
                            picture.setURL(images.getString("url"));

                            mAdapter.addImage(picture);

                        }
                    }
                    //displayResults(data);


                } catch (Exception e) {
                    e.printStackTrace();
                }

                //Log.d(TAG, "CallonResponse isSuccess " + sb.toString() + " ----- ");
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            //Log.d(TAG, "CallonResponse onFailure! " + t.getMessage());
            t.printStackTrace();
        }
    });

Когда я делаю следующие строки ...

Picture picture = new Picture();
picture.setURL(images.getString("url"));
mAdapter.addImage(picture);

В соответствии с моими навыками отладки я могу получить images.getString ("url"). Я чувствую, что есть некоторая проблема при создании изображения, но это не имеет смысла, поскольку у всех классов изображений есть один атрибут, поэтому может быть проблема. в addImage. Ниже я публикую код для своего адаптера ...

Открытый класс ImageAdapter расширяет RecyclerView.Adapter {

private List<Picture> mPictures;
public ImageAdapter(){
    mPictures = new ArrayList<>();
}

@Override
public Holder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View row = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.sample_layout, viewGroup, false);
    return new Holder(row);
}

@Override
public void onBindViewHolder(Holder holder, int i) {
    Picture currPic = mPictures.get(i);
    Picasso.with(holder.itemView.getContext()).load(currPic.getURL()).into(holder.mPhoto1);

}

@Override
public int getItemCount() {
    return 600;
}

public void addImage(Picture picture) {
    mPictures.add(picture);
}

public class Holder extends RecyclerView.ViewHolder{

    private ImageView mPhoto1, mPhoto2;
    public Holder(View itemView) {
        super(itemView);

        mPhoto1 = (ImageView)itemView.findViewById(R.id.image1);
        //mPhoto2 = (ImageView)itemView.findViewById(R.id.image2);
    }
}

}

/ отредактировал:

Этот код находится в моей основной деятельности в самом низу, и он настраивает представления ... он хорошо работал для другого проекта, поэтому я предположил, что именно так я бы это настроил

private void configViews() {
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        //mLayoutManager = new StaggeredGridLayoutManager(VR_SPAN_COUNT, StaggeredGridLayoutManager.VERTICAL);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));
//        mAdapter = new ImageAdapter();
//        mRecyclerView.setAdapter(mAdapter);
    }    
0
Hasan Nagaria 26 Фев 2016 в 17:21

2 ответа

Лучший ответ

Проблема в том, что вы создаете свой адаптер с пустым массивом Pictures.

Вам необходимо сделать следующее:

В своей активности / фрагменте вы должны создать список картинок, например:

List<Picture> mPictures = new ArrayList<Picture>;

И когда вы повторяете свой ответ (данные), вы должны использовать mPictures.add(picture); вместо mAdapter.addImage(picture);

После цикла вы должны создать свой адаптер ImageAdapter mAdapter = new ImageAdapter(mPictures); и установить его в режим просмотра Recycler - mRecyclerView.setAdapter(mAdapter);.

Также вам нужно изменить конструктор адаптера следующим образом:

public ImageAdapter(List<Picture> pictures){
        mPictures = pictures;
}

Метод getItemCount () в вашем адаптере должен выглядеть так:

@Override
public int getItemCount() {
    return mPictures.size();
}

Метод addImage () в адаптере больше не нужен. Вот и все.

1
Ivan Ivanov 26 Фев 2016 в 15:38

Поскольку у вас есть жестко запрограммированные 600 элементов, recyclerview хочет получить отображаемые элементы и запрашивает первый элемент (0)

Picture currPic = mPictures.get(i);

Затем выдает исключение, поскольку у вас нет изображений.

@Override
public int getItemCount() {
    return mPictures.size();
}

А также

mAdapter.addImage(picture);
recyclerView.notifyItemInserted(adapter.getItemCount()-1)

Должен поступать правильно

0
Henning Luther 26 Фев 2016 в 15:05