Recycliewiew adapter with asyncTask

I am trying to use a custom adapter with RecyclerView, but the owners are empty. I do not understand what I missed. Please, help.

In MainActivity AsyncTask:

@Override
    protected void onPostExecute(String result) {
        json_result = result;
        super.onPostExecute(result);
        dialog.dismiss();
        if (result == null) {
            Toast.makeText(MainActivity.this, "error getting results...", Toast.LENGTH_LONG).show();

        } else {

            try {
                JSONObject json = new JSONObject(result);
                Log.e(TAG, "create json object");

                JSONArray searchArray = json.getJSONArray("Search");
                Log.e(TAG, "Search");

                for (int i = 0; i < searchArray.length(); i++) {
                    Log.e(TAG, "run on length");
                    JSONObject searchObject = searchArray.getJSONObject(i);
                    Log.e(TAG, "create search object");
                    String title = searchObject.getString("Title");
                    Log.e(TAG, "Title" + title);
                    String type = searchObject.getString("Type");
                    Log.e(TAG, "Type" + type);
                    String year = searchObject.getString("Year");
                    Log.e(TAG, "Year" + year);
                    String imdbID = searchObject.getString("imdbID");
                    String poster = searchObject.getString("Poster");
                    Log.e(TAG, "" + result);
                    movieList.add(new Movie(title, type, year, imdbID, poster));
                    Log.e(TAG, "Add to adapter");


                }
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(MainActivity.this, "error parsing results...", Toast.LENGTH_LONG).show();
            }

            adapter.notifyDataSetChanged();
            Log.e(TAG, "Notify");

        }
    }

Custom adapter:

public class Adapter extends
    RecyclerView.Adapter<Adapter.ViewHolder> {
private LruCache<String, Bitmap> bitmapCache;
Context context;


public static class ViewHolder extends RecyclerView.ViewHolder {
    public TextView title;
    public TextView year;
    public TextView type;
    public ImageView poster;

    public ViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.txt_title);
        year = (TextView) itemView.findViewById(R.id.txt_year);
        type = (TextView) itemView.findViewById(R.id.txt_rating);
        poster = (ImageView) itemView.findViewById(R.id.imageView);

    }

}

private List<Movie> mList;

public Adapter(List<Movie> mList) {
    this.mList = mList;
    int numImages = 4 * 1024 * 1024;
    this.bitmapCache = new LruCache<String, Bitmap>(numImages) {
        @Override
        protected int sizeOf(String key, Bitmap value) {
            // this is how to calculate a bitmap size in bytes.
            // (bytes-in-a-row * height)
            return value.getRowBytes() * value.getHeight();
        }
    };
}

@Override
public Adapter.ViewHolder onCreateViewHolder
        (ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);
    View movieView = inflater.inflate(R.layout.card_view, parent, false);
    ViewHolder viewHolder = new ViewHolder(movieView);




    return viewHolder;
}

@Override
public void onBindViewHolder
        (Adapter.ViewHolder holder, int position) {
    Movie movie = mList.get(position);
    holder.title.setText(movie.getTitle());
    holder.year.setText(movie.getYear());
    holder.type.setText(movie.getType());
    holder.poster.setVisibility(View.INVISIBLE);
    GetImageTask task = new GetImageTask(movie, holder);
    task.execute(movie.getPoster_url());

}

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

class GetImageTask extends AsyncTask<String, Void, Bitmap> {


    private final Movie movie;
    private final ViewHolder holder;

    public GetImageTask(Movie movie, ViewHolder holder) {
        this.movie = movie;
        this.holder = holder;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        //download:
        String address = params[0];
        Bitmap bitmap = HttpHandler.getBitmap(address, null);

        //save it in the cache for later:
        if (bitmap != null) {
            bitmapCache.put(address, bitmap);
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap result) {

        if (movie.equals(holder.poster)) {
            holder.poster.setVisibility(View.VISIBLE);
            holder.poster.setImageBitmap(result);
        }
    }
}

}

I think the problem is that my movie class is empty, but I have JSON results in asynctask ...

+4
source share
1 answer

The data you received that you saved in the list → movieList. Do you use it in your adapter and set the adapter to reuse mode.

  • Initialize recycler viewing in the main class
  • movielist .
  • recyclerview → recyclerView.setAdapter().

,

+3

Source: https://habr.com/ru/post/1611777/


All Articles