Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Dynamic RecyclerView显示可用联系人并搜索联系人_Android_Android Recyclerview_Android Viewholder - Fatal编程技术网

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=0;toPosition--){ 最终MyModel模型=newModels.get(拓扑位置); 最终int fromPosition=myModels.indexOf(model); if(fromPosition>=0&&fromPosition!=TopoPosition){ 移动项目(从位置、位置); } } } 公共MyModel removeItem(内部位置){ 最终MyModel=myModels.remove(位置); 已移除(位置)的项目; 收益模型; } 公共void附加项(int位置,MyModel){ 添加(位置、型号); (位置); } 公共无效移动项(int-fromPosition、int-toPosition){ 最终MyModel=myModels.remove(从位置); 添加(位置,模型); 已移动的项目(从位置、位置); } 公共类EmptyViewHolder扩展了RecyclerView.ViewHolder{ 公共空视图文件夹(视图项视图){ 超级(项目视图); } } 公共类ViewHolder扩展了RecyclerView.ViewHolder{ 文本视图tvName; TextView-tvPhoneNumber; 图像视图; 公共视图持有者(视图项视图){ 超级(项目视图); tvName=(TextView)itemView.findViewById(R.id.tv_name); tvPhoneNumber=(TextView)itemView.findViewById(R.id.phone_number); ivImage=(ImageView)itemView.findviewbyd(R.id.ivPic); } 公共void绑定(MyModel){ 如果(myModels.size()>0){ Log.e(“Name”,model.getName()); 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()); }否则{ ivImage.setImageResource(R.drawable.default\u contact\u pic); } }否则{ } } }
显示recylerview适配器类的完整代码。这可能是官方错误的一部分,我没有从讨论中得到任何信息。您在Demo Mail中解决了吗?