1

問題の解決策を探しましたが、見つかりませんでした。ここにあります。

textviewとチェックボックスの組み合わせを使用して表示するデータの配列リストがあります。これは、基本的に行ごとに膨らませるカスタムアダプタを使用して行われます。チェックされたデータを取得するまでは、これまでのすべてで問題ありません。

私が他の人から読んだことは、ビューのリサイクルのために、スクロールするとチェックボックスがオフになるということです。私の場合、チェックボックスの状態は残りますが、スクロールせずにチェックボックスを解除する方法がわかりません。チェックボックスをオンにすると、UIで「チェック」されますが、チェックされたアイテムをスクロールして表示から外し、再び元に戻すまで、実際には認識されません。

現在、list.get(position).isSelected()== trueの場合、グローバル配列リストを使用してlist.get(position).getName()を入力します。ただし、アイテムをスクロールして非表示にしてから元に戻さない限り、この配列リストは空のままです。チェックボックスがオフの場合も同じことが当てはまり、スクロールするまで配列リストに残ります。私が念頭に置いているのは、チェックボックスがクリックされたときにすべてのチェックボックスの現在の状態を取得し、配列リストを作成する送信ボタンです。

そのようなものを作成する方法はありますか?

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.qlist, null);

        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.text = (TextView) view.findViewById(R.id.label);
        viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
        viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {


            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Model element = (Model) viewHolder.checkbox.getTag();
                //
                if(isChecked){
                    selctionCount++;
                }
                else if (!isChecked){
                    selctionCount--;
                }
                if(selctionCount > 2)
                {
                     Toast.makeText(context, "error, you checked more than 2!", Toast.LENGTH_LONG).show();
                     element.setSelected(false);
                }
                else
                {
                    element.setSelected(buttonView.isChecked());
                }
                System.out.println(selctionCount);
            }
        });
        view.setTag(viewHolder);
        viewHolder.checkbox.setTag(list.get(position));

    } 
    else {
        view = convertView;
        ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.text.setText(list.get(position).getName());

    //This is the problem here! the selected arraylist (global) is empty even when i check the boxes, 
    //it only populates when i scroll the checked boxes out of view and back in! helphelp!
    holder.checkbox.setChecked(list.get(position).isSelected());
    if (list.get(position).isSelected() == true){
        selected.add(list.get(position).getName());
    }
    else if (list.get(position).isSelected() == false){
        selected.remove(list.get(position).getName());
    }
    return view;
}

}

4

1 に答える 1

1

私はすでに同様の問題を台無しにしています。最初に、チェックボックスの状態をfalseとして初期化し、すべての状態を配列リストに保存する関数をコンストラクターで呼び出すことができます。チェックボックスがクリックされるときはいつでも、ボックスをチェックして、その状態をブール配列リストに保存してください。後で、arraylistから状態を取得できます。あなたが理解していないなら、私があなたを助けるために数行のコードを送ろうとすることを私に知らせてください...

ここにあなたの助けのための小さなコードがあります:私はブール配列リストを作成します。

private ArrayList<Boolean> itemChecked      = null;

次に、コンストラクターですべてのチェックボックスの状態をfalseに設定します。

    for (int i=0; i < no_of_elements.size(); i++) {
        itemChecked.add(i, false);
    }

チェックボックスをクリックしたときの実際のチェック状態を設定します。

        holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                                         boolean isChecked) {
                itemChecked.set(position, isChecked);

            }
        });
于 2012-04-17T12:35:36.950 に答える