android-asynctask - 带有 asyncTask 的 Recyclerview 适配器

标签 android-asynctask adapter android-recyclerview

我正在尝试将自定义适配器与 RecyclerView 一起使用,但持有人是空的。我不明白我错过了什么。请帮忙。

在 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");

        }
    }

自定义适配器:
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);
        }
    }
}

}

我认为问题是我的电影类是空的,但我在 asynctask 中有 JSON 结果......

最佳答案

您收到的数据,已保存在列表 -->movieList 中。
您是否在适配器中使用过它并将适配器设置为回收站 View 。

  • 在主类中初始化回收器 View
  • 初始化适配器并将电影列表作为参数传递给创建的适配器对象。
  • 将适配器附加到 recyclerview --> recyclerView.setAdapter(adapter)。

  • 我认为这应该有效

    关于android-asynctask - 带有 asyncTask 的 Recyclerview 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33147702/

    相关文章:

    android - 如何暂停 AsyncTask 以询问用户的详细信息?

    Android AsyncTask问题

    android - AsyncTask 与无尽的 ListView 滚动在 android

    ios - 无法从我的协议(protocol)类调用委托(delegate)方法

    java - Android: ListView 中的复选框(如何在适配器中创建OnCheckedChangeListener)

    java - 具有多个适配器和 View 类型的 Recycler View 不工作

    android - 如何使用 StaggeredGridLayoutManager 重排 RecyclerView 中的项目

    android - 显示来自异步任务的消息

    java - 从 AlertDialog 输入向 RecyclerView 添加项目

    android - 以编程方式在 recyclerview onbindView 适配器中添加 textview