3

Below is the code for onCreateViewHolder() Method. Here i'm checking if list is empty or not.

I've a searchView to search contacts. When there is no contacts with search name then the layout "no_contacts" will be displayed.

But when i press backspace to remove the search string it is throwing Exception:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{528a9274 position=12 id=-1, oldPos=0, pLpos:0 scrap [attachedScrap] tmpDetached no parent}

Please help me regarding this problem.

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    switch(viewType) {
        case VIEW_TYPE_EMPTY_LIST_PLACEHOLDER:
            // return view holder for your placeholder
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.no_contacts, parent, false);
            EmptyViewHolder evh = new EmptyViewHolder(v);
            return evh;

        case VIEW_TYPE_OBJECT_VIEW:
            // return view holder for your normal list item
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_row, parent, false);
            ViewHolder vh = new ViewHolder(v);
            return vh;

    }
    return null;
}

Here is the complete code

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

private static final int VIEW_TYPE_EMPTY_LIST_PLACEHOLDER = 0;
private static final int VIEW_TYPE_OBJECT_VIEW = 1;
List<MyModel> myModels = new ArrayList<>();
Context context;

public MyAdapter(Context context, List<MyModel> mModels) {

    myModels = new ArrayList<>(mModels);
    this.context = context;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v;
    switch(viewType) {
        case VIEW_TYPE_EMPTY_LIST_PLACEHOLDER:
            // return view holder for your placeholder
             v = LayoutInflater.from(parent.getContext()).inflate(R.layout.no_contacts, parent, false);
            EmptyViewHolder evh = new EmptyViewHolder(v);
            return evh;

        case VIEW_TYPE_OBJECT_VIEW:
            // return view holder for your normal list item
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_row, parent, false);
            ViewHolder vh = new ViewHolder(v);
            return vh;

    }
    return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    try {
        if (holder instanceof ViewHolder) {
            ViewHolder vh = (ViewHolder) holder;
            MyModel model = myModels.get(position);
            vh.bind(model);
        }
    } catch (IndexOutOfBoundsException e) {
        e.printStackTrace();
    }

}

@Override
public int getItemCount() {
    return myModels.size() > 0 ? myModels.size() : 1;
}


@Override
public int getItemViewType(int position) {
    if (myModels.isEmpty()) {
        return VIEW_TYPE_EMPTY_LIST_PLACEHOLDER;
    } else {
        return VIEW_TYPE_OBJECT_VIEW;
    }
}

public void animateTo(List<MyModel> models) {

    applyAndAnimateRemovals(models);
    applyAndAnimateAdditions(models);
    applyAndAnimateMovedItems(models);
}

private void applyAndAnimateRemovals(List<MyModel> newModels) {
    for (int i = myModels.size() - 1; i >= 0; i--) {
        final MyModel model = myModels.get(i);
        if (!newModels.contains(model))
            removeItem(i);
    }
}

private void applyAndAnimateAdditions(List<MyModel> newModels) {
    for (int i = 0, count = newModels.size(); i < count; i++) {
        final MyModel model = newModels.get(i);
        if (!myModels.contains(model)) {
            addItem(i, model);
        }
    }
}

private void applyAndAnimateMovedItems(List<MyModel> newModels) {
    for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) {
        final MyModel model = newModels.get(toPosition);
        final int fromPosition = myModels.indexOf(model);
        if (fromPosition >= 0 && fromPosition != toPosition) {
            moveItem(fromPosition, toPosition);
        }
    }
}

public MyModel removeItem(int position) {
    final MyModel model = myModels.remove(position);
    notifyItemRemoved(position);
    return model;
}

public void addItem(int position, MyModel model) {
    myModels.add(position, model);
    notifyItemInserted(position);
}

public void moveItem(int fromPosition, int toPosition) {
    final MyModel model = myModels.remove(fromPosition);
    myModels.add(toPosition, model);
    notifyItemMoved(fromPosition, toPosition);
}

public class EmptyViewHolder extends RecyclerView.ViewHolder {

    public EmptyViewHolder(View itemView) {
        super(itemView);
    }
}

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView tvName;
    TextView tvPhoneNumber;
    ImageView ivImage;

    public ViewHolder(View itemView) {
        super(itemView);
        tvName = (TextView) itemView.findViewById(R.id.tv_name);
        tvPhoneNumber = (TextView) itemView.findViewById(R.id.phone_number);
        ivImage = (ImageView) itemView.findViewById(R.id.ivPic);
    }

    public void bind(MyModel model) {
        if (myModels.size() > 0) {
            Log.e("Name ", model.getName());
            tvName.setText(model.getName());
            tvPhoneNumber.setText(model.getPhoneNumber());
            Log.e("Image getImagePath()", model.getImagePath());
            Log.e("Image URI()", "" + Uri.parse(model.getImagePath()));
            if (model.getImagePath().startsWith("/")) {
                ivImage.setImageURI(Uri.parse(model.getImagePath()));
            } else {
                ivImage.setImageResource(R.drawable.default_contact_pic);
            }
        } else {
        }

    }
}
Mohd Asif Ahmed
  • 1,880
  • 2
  • 15
  • 29

0 Answers0