Alex Levit
Alex Levit

Reputation: 61

Recyclerview adapter with asyncTask

I'm trying to use custom adapter with RecyclerView, but the holders are empty. I can't understand what did i miss. Please help.

In MainActivity's 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 do have JSON results in asynctask...

Upvotes: 4

Views: 5828

Answers (1)

saDashiv sinha
saDashiv sinha

Reputation: 165

Your received data , which you have saved in the list -->movieList. Have you used it in your adapter and set the adapter to the recycler view.

  1. Initialize recycler view in main class
  2. initialize adapter and pass the movielist as arguement to the adapter object created.
  3. attach the adapter to the recyclerview --> recyclerView.setAdapter(adapter).

I think this should work

Upvotes: 3

Related Questions