0

我正在使用 BaseAdapter 自定义我的列表视图

public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View view, ViewGroup parent) {
            if (view == null) {
                LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.products_item, null);
            }

            FileBean file = (FileBean) ((ExtendedList) (Object) categories.get(groupPosition)).getItem(childPosition);

            CheckBox checkBox = (CheckBox) view.findViewById(R.id.fileCheckBox);
            if(checkBox != null){
                if(mCheckBoxListener != null){
                    checkBox.setOnCheckedChangeListener(mCheckBoxListener);
                }
                checkBox.setChecked(file.isChecked());
                Log.d("getcview", String.valueOf(file.isChecked() + " " + file.getName() 
                        + " " + groupPosition + " "  + childPosition));
            }

            setProductDetails(file, view);

            ViewHolder holder = new ViewHolder();
            holder.groupPosition = groupPosition;
            holder.childPosition = childPosition;
            Log.d("exadapter", "Child " + file.getName());

            view.setTag(holder);
            return view;
        }
4

3 回答 3

1

您的问题与滚动列表视图时视图被回收的事实有关。您必须每次重置复选框的正确值(选中与否)。

您正在这样做,但您的订单错误,并且每次重置复选框选中/未选中值时都会触发 OnCheckListener(您首先设置侦听器,然后更改复选框值)。

  1. 删除 OnCheckListener
  2. 设置复选框值
  3. 再次添加您的听众

正确的顺序:

checkBox.setOnCheckedChangeListener(null);
checkBox.setChecked(file.isChecked());
checkBox.setOnCheckedChangeListener(mCheckBoxListener)
于 2013-06-03T13:50:27.353 回答
0

在您的 baseadapter 类中覆盖这两个方法:

@Override
    public int getViewTypeCount() {

        if (getCount() != 0)
            return getCount();

        return 1;
    }

    @Override
    public int getItemViewType(int position) {

        return position;
    }

看看它是否有效。

于 2013-06-03T13:40:28.417 回答
0

我看到两个问题,

1 - 将您的 LayoutInflater 移出 getView 方法,您在那里创建了很多垃圾。相反,创建一个实例变量来存储 LayoutInflater,并在适配器的构造函数中创建它。(这与混音无关)。

private LayoutInflater mInflater; //instance variable

public CustomAdapter(Context context, List<Item> items) {
    //some code
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

2 - 您在每次调用 getView()时创建 ViewHolder 实例。移动这段代码:

ViewHolder holder = new ViewHolder();
holder.groupPosition = groupPosition;
holder.childPosition = childPosition;
Log.d("exadapter", "Child " + file.getName());
view.setTag(holder);

在converview的空检查中。您只想在 converView 为空时创建一个新的 ViewHolder(仅在新视图上)。

public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View view, ViewGroup parent) {
    //First, get the Tag from the converView
    ViewHolder mHolder = (ViewHolder) view.getTag();
    //Now check if the holder is null, rather than checking if the convertView is null.
    if (mHolder == null) {
        //init the holder code
        view.setTag(mHolder);  //only set the Tag if it's a new view.
    }

此外,您使用 ViewHolder 模式的方式是错误的,例如,您应该使用 ViewHolder 来存储 CheckBox,因此您不必findViewById(R.id.fileCheckBox);在每个 getView 调用中调用。

希望有帮助。

于 2013-06-03T13:48:38.427 回答