RecyclerView не показывает данные - PullRequest
0 голосов
/ 06 марта 2020

У меня есть простой RecyclerView. это показывает кучу изображений, извлеченных из API. но когда я запускаю приложение, RecyclerView не показывает ничего. когда я отлаживаю, это показывает, что мой список пуст! Я предполагаю, что проблема зависит от функции loadimages. но я пробовал раньше с простым TextView, и это сработало. Я все еще новичок в этом, и я просто практикуюсь.

Основная активность:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RecyclerView recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setHasFixedSize(true);

    MallsAdapter adapter = new MallsAdapter(getApplicationContext());
    recyclerView.setAdapter(adapter);
}

Активность адаптера:

public class MallsAdapter extends RecyclerView.Adapter<MallsAdapter.MallsViewHolder> {

public static class MallsViewHolder extends RecyclerView.ViewHolder {
    public ImageView imageView;
    public LinearLayout containerView;

    public MallsViewHolder(@NonNull View itemView) {
        super(itemView);

        containerView = itemView.findViewById(R.id.pics_row);
        imageView = itemView.findViewById(R.id.flowers_pic);
    }
}

public List<Flowers> images = new ArrayList<>();
private static List<Drawable> drawables = new ArrayList<>();
private RequestQueue requestQueue;


public MallsAdapter(Context context) {
    requestQueue = Volley.newRequestQueue(context);
    loadImages();
}

@NonNull
@Override
public MallsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.malls_item, parent, false);
    return new MallsViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MallsViewHolder holder, int position) {
    holder.imageView.setBackground(drawables.get(position));
}

@Override
public int getItemCount() {
    if (images != null) {
        return images.size();
    } else {
        return 0;
    }
}

public static class DownloadImage extends AsyncTask<String, Void, Drawable> {
    @Override
    protected Drawable doInBackground(String... strings) {
        return downloadImage(strings[0]);
    }

    @Override
    protected void onPostExecute(Drawable drawable) {
        drawables.add(drawable);
    }

    private Drawable downloadImage(String urlLink) {
        URL url;
        InputStream in;
        BufferedInputStream buf;
        try {
            url = new URL(urlLink);
            in = url.openStream();
            buf = new BufferedInputStream(in);
            Bitmap bMap = BitmapFactory.decodeStream(buf);

            return new BitmapDrawable(bMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

private void loadImages() {
    String url = "https://pixabay.com/api/?key=15507399-305bf88eb0892f7cdf58fb66b&image_type=photo&pretty=true&q=yellow+flowers";
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray hits = response.getJSONArray("hits");
                for (int i = 0; i < hits.length(); i++) {
                    JSONObject pics = hits.getJSONObject(i);
                    images.add(new Flowers(pics.getString("id"), pics.getString("largeImageURL")));
                }
                for (int i = 0; i < images.size(); i++) {
                    Flowers flowers = new Flowers(images.get(i).getId(), images.get(i).getImageURL());
                    new DownloadImage().execute(flowers.getImageURL());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("test", "Error", error);
        }
    });
    requestQueue.add(request);
}

1 Ответ

1 голос
/ 06 марта 2020

2 вещи: во-первых, у адаптера не должно быть никаких знаний о том, как извлекаются ваши данные, на самом деле это даже не его обязанность выполнять эту работу. Например, в архитектуре MVVM ваша активность будет вызывать ViewModel, который, в свою очередь, вызывает хранилище для извлечения данных, а затем, когда данные получены, действие передает их адаптеру.

Во-вторых, и это наиболее важно для вашей проблемы: когда ваш адаптер получает новые данные, ваш адаптер не будет догадываться, есть ли новый материал для рендеринга, поэтому всякий раз, когда появляются новые данные, он должен вызывать notifyDataSetChanged, что, в свою очередь, вызывает getItemCount и onBindViewHolder для обновления sh вашего списка.

Пример:

// On your adapter
public void submitData(List<MyData> data) {
    this.data = data;
    notifyDataSetChanged();
}

@Override
public int getItemCount() {
    return data.size();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...