0

When use RecycleView , the getAdapterPosition() always return -1.I don't know why.

My onCreateViewHolder Codes are as follows :

public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
    final ViewHolder holder = new ViewHolder(view);
    // add OnClickListener
    holder.mFruitView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = holder.getAdapterPosition();
            Fruit fruit = mFruitList.get(position);
            Toast.makeText(v.getContext(),"You Click : " + fruit.getName(),Toast.LENGTH_SHORT).show();
        }
    });
    return new ViewHolder(view);
}

And My ViewHolder Codes like this :

static class ViewHolder extends RecyclerView.ViewHolder{
    View mFruitView;
    ImageView fruitImage;
    TextView fruitName;
    public ViewHolder(View itemView) {
        super(itemView);
        mFruitView = itemView;
        fruitImage = (ImageView) itemView.findViewById(R.id.iv_fruit);
        fruitName = (TextView) itemView.findViewById(R.id.tv_fruit);
    }
}

The Logs when error occurred are as follows :

java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1

Any help will be grateful

Brian
  • 53
  • 5

3 Answers3

0

My Adapter Codes :

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {

private static final String TAG = "FruitAdapter";
private List<Fruit> mFruitList;
public FruitAdapter(List<Fruit> fruitList){
    mFruitList = fruitList;
}
@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
    final ViewHolder holder = new ViewHolder(view);
    // add OnClickListener
    holder.mFruitView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Fruit fruit = mFruitList.get(position);
            Toast.makeText(v.getContext(),"You Click : " + fruit.getName(),Toast.LENGTH_SHORT).show();
        }
    });
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Fruit fruit = mFruitList.get(position);
    holder.fruitImage.setImageResource(fruit.getImageId());
    holder.fruitName.setText(fruit.getName());
}

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

static class ViewHolder extends RecyclerView.ViewHolder{
    View mFruitView;
    ImageView fruitImage;
    TextView fruitName;
    public ViewHolder(View itemView) {
        super(itemView);
        mFruitView = itemView;
        fruitImage = (ImageView) itemView.findViewById(R.id.iv_fruit);
        fruitName = (TextView) itemView.findViewById(R.id.tv_fruit);
    }
}
}
Brian
  • 53
  • 5
0

Modify your adapter:

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {

    private static final String TAG = FruitAdapter.class.getSimpleName();
    private List<Fruit> mFruitList;

    public FruitAdapter(List<Fruit> fruitList) {
        mFruitList = fruitList;
    }

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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        final Fruit fruit = mFruitList.get(position);
        holder.fruitImage.setImageResource(fruit.getImageId());
        holder.fruitName.setText(fruit.getName());
        holder.mFruitView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "You Click : " + fruit.getName(), Toast.LENGTH_SHORT).show();
            }
        });
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {
        View mFruitView;
        ImageView fruitImage;
        TextView fruitName;

        public ViewHolder(View itemView) {
            super(itemView);
            mFruitView = itemView;
            fruitImage = (ImageView) itemView.findViewById(R.id.iv_fruit);
            fruitName = (TextView) itemView.findViewById(R.id.tv_fruit);
        }
    }
}
Janice Kartika
  • 502
  • 1
  • 3
  • 14
0

The method getAdapterPosition() always returns -1 when recyclerview makes layout calculations. You are calling this methods inside ViewHolder. It means RecyclerView is doing calculations. If you need the position inside click actions of view, call it in the public void onClick(final View v) method for example:

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {

    private static final String TAG = "FruitAdapter";

private List<Fruit> mFruitList;

public FruitAdapter(List<Fruit> fruitList) {
    mFruitList = fruitList;
}

@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    holder.fruitImage.setImageResource(fruit.getImageId());
    holder.fruitName.setText(fruit.getName());

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            Fruit fruit = mFruitList.get(position);
            Toast.makeText(v.getContext(), "You Click : " + fruit.getName(), Toast.LENGTH_SHORT).show();
        }

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

        static class ViewHolder extends RecyclerView.ViewHolder {
            View mFruitView;
            ImageView fruitImage;
            TextView fruitName;

            public ViewHolder(View itemView) {
                super(itemView);
                mFruitView = itemView;
                fruitImage = (ImageView) itemView.findViewById(R.id.iv_fruit);
                fruitName = (TextView) itemView.findViewById(R.id.tv_fruit);
            }
        }
    }
Nick
  • 4,820
  • 18
  • 31
  • 47