【问题标题】:How to maintain position of list view row/item?如何维护列表视图行/项目的位置?
【发布时间】:2016-06-11 11:47:03
【问题描述】:

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

我正在做的任务:

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

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

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

    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 随机显示图像,而与 TRUE 条件无关。

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

我知道这是维护列表项位置或 ListView 在滚动时回收的问题。如何做到这一点?

【问题讨论】:

  • @sushildlh 已经尝试过 SparseBooleanArray。请分享建设性的 cmets
  • 您有条件地调用setImageResource:您必须在else 子句中“清除”它,还要摆脱那个持有者的东西:它只会弄乱代码,它的好处几乎等于零
  • @pskink 请查看我的编辑

标签: android listview checkbox android-imageview


【解决方案1】:

您有这样的情况:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多