Android Dynamic RecyclerView显示可用联系人并搜索联系人
下面是Android Dynamic RecyclerView显示可用联系人并搜索联系人,android,android-recyclerview,android-viewholder,Android,Android Recyclerview,Android Viewholder,下面是onCreateViewHolder()方法的代码。在这里,我检查列表是否为空 我有一个searchView来搜索联系人。如果没有具有搜索名称的联系人,则将显示布局“无联系人”“ 但当我按backspace删除搜索字符串时,它会引发异常: java.lang.IndexOutOfBoundsException:检测到不一致。无效的 视图支架适配器位置视图支架{528a9274位置=12 id=-1, oldPos=0,pLpos:0报废[attachedScrap]tmpDetached无
onCreateViewHolder()
方法的代码。在这里,我检查列表是否为空
我有一个searchView
来搜索联系人。如果没有具有搜索名称的联系人,则将显示布局“无联系人”
“
但当我按backspace删除搜索字符串时,它会引发异常:
java.lang.IndexOutOfBoundsException:检测到不一致。无效的
视图支架适配器位置视图支架{528a9274位置=12 id=-1,
oldPos=0,pLpos:0报废[attachedScrap]tmpDetached无父项}
请帮我解决这个问题
@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;
}
这是完整的代码
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 {
}
}
}
公共类MyAdapter扩展了RecyclerView.Adapter{
私有静态最终整型视图\类型\空\列表\占位符=0;
私有静态最终整型视图\类型\对象\视图=1;
List myModels=new ArrayList();
语境;
公共MyAdapter(上下文、列表MMODEL){
myModels=新阵列列表(mModels);
this.context=上下文;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
观点五;
开关(视图类型){
案例视图\类型\空\列表\占位符:
//返回占位符的视图保持架
v=LayoutFlater.from(parent.getContext()).flate(R.layout.no_contacts,parent,false);
EmptyViewHolder evh=新的EmptyViewHolder(v);
返回evh;
案例视图\类型\对象\视图:
//返回普通列表项的视图保持架
v=LayoutInflater.from(parent.getContext()).flate(R.layout.contacts_行,parent,false);
视窗支架vh=新视窗支架(v);
返回vh;
}
返回null;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
试一试{
if(视图保持架的保持架实例){
视窗支架vh=(视窗支架)支架;
MyModel=myModels.get(位置);
绑定(模型);
}
}catch(IndexOutOfBoundsException e){
e、 printStackTrace();
}
}
@凌驾
public int getItemCount(){
返回myModels.size()>0?myModels.size():1;
}
@凌驾
public int getItemViewType(int位置){
if(myModels.isEmpty()){
返回视图\类型\空\列表\占位符;
}否则{
返回视图\类型\对象\视图;
}
}
public void animateTo(列出模型){
应用数据删除(模型);
应用程序添加(模型);
应用数据移动数据项(模型);
}
私有无效应用程序数据删除(列出新模型){
对于(int i=myModels.size()-1;i>=0;i--){
最终MyModel=myModels.get(i);
如果(!newModels.contains(model))
删除项目(i);
}
}
私有无效应用程序添加(列出新模型){
for(int i=0,count=newModels.size();i显示recylerview适配器类的完整代码。这可能是官方错误的一部分,我没有从讨论中得到任何信息。您在Demo Mail中解决了吗?