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

私は2つの問題を見て、

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 が null の場合にのみ、新しい 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 を格納する必要があるため、getView 呼び出しfindViewById(R.id.fileCheckBox);ごとに呼び出す必要はありません。

それが役立つことを願っています。

于 2013-06-03T13:48:38.427 に答える
0

baseadapter クラスでこの 2 つのメソッドをオーバーライドします。

@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 に答える