RecyclerView多个布局导致ClassCastException

RecyclerView multiple layouts causes ClassCastException

程序员!我尝试为 RecyclerView 制作多个 itemType 并且我已经发现了类似的问题,但他们没有帮助我解决我的问题。

代码:

public class RecyclerAdapter extends   RecyclerView.Adapter<RecyclerView.ViewHolder> implements AdListener {
protected List<FoodData> foodDataList;
protected Context context;
protected String image_url, food_title, id;
protected int ingredients_count;
protected Intent intent;
private static final String FROM = "c172x172";
private static final String TO = "c480x180";
private HashMap<Integer, String> titleMap = new HashMap<>();


public RecyclerAdapter(List<FoodData> food, Context context) {
    this.foodDataList = food;
    this.context = context;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case 0:
            return new MainViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.test_add, parent, false));
        case 2:
            return new AdditionalHolderl(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false));

    }
    return null;
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
    switch (holder.getItemViewType()) {

        case 0:
            MainViewHolder m_holder = (MainViewHolder) holder;
            image_url = foodDataList.get(position).getRecipe_image_url();
            image_url = image_url.replaceAll(FROM, TO);
            food_title = foodDataList.get(position).getRecipe_text();
            if (titleMap.containsKey(position)) {
                m_holder.title.setText(titleMap.get(position));
            } else {
                titleMap.put(position, food_title);
                updateTextViewUI(m_holder.title, food_title);
            }

            id = foodDataList.get(position).getRecipe_id();
            ingredients_count = foodDataList.get(position).getRecipe_ingr_count();

            Picasso.with(context)
                    .load(image_url)
                    .into(m_holder.food_picture);

            m_holder.title.setText(food_title);
            m_holder.ingr_count.setText("Количество ингридиентов: " + ingredients_count);
            m_holder.look.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    intent = new Intent(context, FoodAppearance.class);
                    intent.putExtra("id", foodDataList.get(position).getRecipe_id());
                    context.startActivity(intent);

                }
            });
            m_holder.food_picture.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    intent = new Intent(context, FoodAppearance.class);
                    intent.putExtra("id", foodDataList.get(position).getRecipe_id());
                    context.startActivity(intent);
                }
            });
            return;
    case 2:
            AdditionalHolderl new_holder = (AdditionalHolderl) holder;
            new_holder.lol.setText("Text");
            return;
        default:
            break;

    }


}


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

private void updateTextViewUI(final TextView textView, final String title) {
    new Handler(context.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            textView.setText(title);

        }
    });
}


@Override
public int getItemViewType(int position) {
    return position % 2 * 2;
}


public class MainViewHolder extends RecyclerView.ViewHolder {

    protected ImageView food_picture;
    protected TextView title, ingr_count, look;
    protected LinearLayout linearLayout;

    public MainViewHolder(View view) {
        super(view);
        food_picture = (ImageView) view.findViewById(R.id.food_picture);
        title = (TextView) view.findViewById(R.id.title);
        ingr_count = (TextView) view.findViewById(R.id.ingr_count);
        look = (TextView) view.findViewById(R.id.look);
        linearLayout = (LinearLayout) view.findViewById(R.id.list_item);


    }

}

public class AdditionalHolderl extends RecyclerView.ViewHolder {
    protected TextView lol;

    public AdditionalHolderl(View view) {
        super(view);
        lol = (TextView) view.findViewById(R.id.lol);

    }
}
}

编辑

好的,新的 LogCat:

  java.lang.IllegalArgumentException: Target must not be null.
                                                            at com.squareup.picasso.RequestCreator.into(RequestCreator.java:618)
                                                            at com.squareup.picasso.RequestCreator.into(RequestCreator.java:601)
                                                            at be.motti.uzb.RecyclerAdapter.onBindViewHolder(RecyclerAdapter.java:80)

这一行:

  Picasso.with(context)...

尝试 remove/comment Picasso 的实现,但随后下一个元素变为 null 并导致 NPE

编辑

我有debugged,发现MainViewHolder里面的View都是null?他们为什么?当我使用单个 ViewHolder 时它们不是 如果你能帮助我,我会很高兴。 提前致谢!

您的 onBindViewHolder() 在视图类型方面似乎是错误的。在 onCreateViewHolder() 中,位置 0 返回 MainViewHolder,位置 2 返回 AdditionalViewHolder

onBindViewHolder() 中交换 02,它应该可以工作。

尝试

instanceof

关键字正确!

在您的 onBindViewHolder(ViewHolder holder,int position) 中执行以下操作

    if(holder instanceof AdditionalViewHolder)
{
//Do your stuff for AdditionalViewHolder
}else{ //Do your stuff for MainViewHolder}

反转 onBindViewHolder 的开关。也就是说,在案例 0 中,处理 MainViewHolder。那应该可以解决问题。