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

时间:2016-06-11 11:47:04

标签: android listview checkbox android-imageview

我的自定义ListView包含TextViewImageViewCheckbox。在ListView中,不应该检查/取消选中任何内容,因为我必须根据条件阻止它。

我正在做的任务:

  1. 如果选中Checkbox,则应在ImageView中显示图片。

  2. 我不想根据条件对CheckBox进行检查/启用。

  3. 以下是我的自定义适配器代码。

        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;
            }
        }
    

    我的问题是:

    1. 在滚动时,ImageView会随机显示图片,而不管其是否为真。

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

    3. 我知道这是在滚动时保持列表项位置或ListView的回收问题。怎么做?

1 个答案:

答案 0 :(得分:0)

您的条件如下:

#define MAX_RESOURCE_SIZE 65536 // There is no maximum size - you'll need to pick one
static char buffer[MAX_RESOURCE_SIZE];
...
if (myResourceSize>MAX_RESOURCE_SIZE) {
    Error("Resource too big!");
} // if
memcpy(buffer, pMyBinaryData, myResourceSize);

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

我的建议是你用以下方式做某事:

false