Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.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 如何维护列表视图行/项的位置?_Android_Listview_Checkbox_Android Imageview - Fatal编程技术网

Android 如何维护列表视图行/项的位置?

Android 如何维护列表视图行/项的位置?,android,listview,checkbox,android-imageview,Android,Listview,Checkbox,Android Imageview,我有一个自定义的列表视图,其中包含文本视图,图像视图,复选框。在列表视图中不应选中/取消选中任何内容,因为我必须根据条件对其进行阻止 我正在做的任务: 如果选中了复选框,则应在图像视图中显示图像 我不想根据条件使复选框可检查/启用 下面是我的自定义适配器代码 public class CustomAdapter extends BaseAdapter { private Context context; private ArrayList<POJ

我有一个自定义的
列表视图
,其中包含
文本视图
图像视图
复选框
。在
列表视图中
不应选中/取消选中任何内容,因为我必须根据条件对其进行阻止

我正在做的任务:

  • 如果选中了
    复选框
    ,则应在
    图像视图
    中显示图像

  • 我不想根据条件使
    复选框
    可检查/启用

  • 下面是我的自定义适配器代码

        public class CustomAdapter  extends BaseAdapter {
    
            private Context context;
            private ArrayList<POJO> mainDataList;
            private LayoutInflater inflater = null;
    
            public CustomAdapter(Context context, ArrayList< POJO > mainDataList) {
                this.context = context;
                this.mainDataList = mainDataList;
                inflater = ( LayoutInflater ) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            }
    
            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return mainDataList.size();
            }
    
            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }
    
            @Override
            public POJO getItem(int position) {
                // TODO Auto-generated method stub
                return mainDataList.get(position);
            }
    
            public class Holder
            {
                private TextView name;
                private ImageView imageView;
                private CheckBox check;
            }
    
            @Override
            public View getView(final int position, View view, ViewGroup parent) {
                // TODO Auto-generated method stub
                final Holder holder;
                if (view == null) {
                    holder = new Holder();
                    view = inflater.inflate(R.layout.my_layout_file, null);
                    holder.name = (TextView) view.findViewById(R.id.textView_Name);
                    holder.imageView = (ImageView) view.findViewById(R.id.img);
                    holder.check = (CheckBox) view.findViewById(R.id.checkBox);
    
                    view.setTag(holder);
                } else {
                    holder = (Holder) view.getTag();
                }
    
                holder.check.setTag(position);
    
                if (mainDataList.get(position).isEditable()) {
                        holder.check.setEnabled(false);
                        holder.check.setClickable(false);
                    } else {
                        holder.check.setEnabled(true);
                        holder.check.setClickable(true);
                    }
                }
    
                holder.name.setText(mainDataList.get(position).getName());
                holder.check.setChecked(mainDataList.get(position).isSelected());
    
                if (mainDataList.get(position).isSelected())
                            holder.imageView.setImageResource(R.drawable.ic_launcher);
                else
                    holder.imageView.setImageResource(null);
    
                return view;
            }
        }
    
    公共类CustomAdapter扩展了BaseAdapter{
    私人语境;
    私有ArrayList主数据列表;
    专用充气机=空;
    公共CustomAdapter(上下文,ArrayListmainDataList){
    this.context=上下文;
    this.mainDataList=mainDataList;
    充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
    }
    @凌驾
    public int getCount(){
    //TODO自动生成的方法存根
    返回mainDataList.size();
    }
    @凌驾
    公共长getItemId(int位置){
    //TODO自动生成的方法存根
    返回位置;
    }
    @凌驾
    公共POJO getItem(内部位置){
    //TODO自动生成的方法存根
    返回mainDataList.get(位置);
    }
    公共类持有者
    {
    私有文本视图名称;
    私人影像视图;
    私人复选框检查;
    }
    @凌驾
    公共视图getView(最终整数位置、视图视图、视图组父视图){
    //TODO自动生成的方法存根
    最终持有人;
    如果(视图==null){
    保持架=新保持架();
    视图=充气机.充气(R.layout.my_layout_文件,空);
    holder.name=(TextView)view.findViewById(R.id.TextView\u name);
    holder.imageView=(imageView)view.findViewById(R.id.img);
    holder.check=(CheckBox)view.findViewById(R.id.CheckBox);
    视图.设置标签(支架);
    }否则{
    holder=(holder)view.getTag();
    }
    支架.检查.设置标签(位置);
    if(mainDataList.get(position.isEditable()){
    holder.check.setEnabled(假);
    保持架。检查。可点击设置(错误);
    }否则{
    holder.check.setEnabled(真);
    保持架。检查。可点击设置(真);
    }
    }
    holder.name.setText(mainDataList.get(position.getName());
    holder.check.setChecked(mainDataList.get(position.isSelected());
    if(mainDataList.get(position.isSelected())
    holder.imageView.setImageResource(R.drawable.ic_启动器);
    其他的
    holder.imageView.setImageResource(空);
    返回视图;
    }
    }
    
    我的问题是:

  • 在滚动时,
    ImageView
    随机显示图像,与真实情况无关

  • 滚动时,在每4-5个列表项/行项之后,由于项目1不可检查,因此项目变得不可检查(我的设备在屏幕上显示4-5个单元格/行/项,但不滚动)。简单地说,它按照getView()机制进行检索


  • 我知道这是维护列表项位置或滚动列表视图循环的问题。如何执行此操作?

    您有以下情况:

    if (mainDataList.get(position).isSelected())
               holder.imageView.setImageResource(R.drawable.ic_launcher);
    
    这意味着,如果模型将其属性选择为
    true
    ,它将为图像视图设置一些图像资源。问题在于,无论何时滚动并
    isSelected()
    产生
    false
    ,您都不会做任何事情。因为您正在使用这些视图,所以您会得到一些旧视图,这些视图在某些时候已将
    isSelected()
    设置为true。它当前可能是
    false
    ,但您尚未为此指定任何条件

    我的建议是,你应该在以下方面做一些事情:

    if (mainDataList.get(position).isSelected()) 
    {
        holder.imageView.setImageResource(R.drawable.ic_launcher);
    } 
    else 
    { 
        holder.imageView.setImageResource(null);
    }
    

    您有以下情况:

    if (mainDataList.get(position).isSelected())
               holder.imageView.setImageResource(R.drawable.ic_launcher);
    
    这意味着,如果模型将其属性选择为
    true
    ,它将为图像视图设置一些图像资源。问题在于,无论何时滚动并
    isSelected()
    产生
    false
    ,您都不会做任何事情。因为您正在使用这些视图,所以您会得到一些旧视图,这些视图在某些时候已将
    isSelected()
    设置为true。它当前可能是
    false
    ,但您尚未为此指定任何条件

    我的建议是,你应该在以下方面做一些事情:

    if (mainDataList.get(position).isSelected()) 
    {
        holder.imageView.setImageResource(R.drawable.ic_launcher);
    } 
    else 
    { 
        holder.imageView.setImageResource(null);
    }
    

    @Sushildh已经尝试SparseBooleanArray了。请分享建设性意见您有条件地调用
    setImageResource
    :您必须在
    else
    子句中“清除”它,同时也要清除持有者的东西:它只会弄乱代码,其好处几乎与zero@pskink请看我的edits@sushildlh已尝试SparseBooleanArray。请分享建设性意见您有条件地调用
    setImageResource
    :您必须在
    else
    子句中“清除”它,同时也要清除持有者的东西:它只会弄乱代码,其好处几乎与zero@pskink请看我的编辑