2

ArrayAdapter 内に getTag() があるelseセクションの以下のコード

  holder = (ViewHolder) convertView.getTag();

このセクションを使用して、ビュー アイテムの最新の状態を更新または取得し、その状態を保存された状態と一致させるにはどうすればよいですか。チェックボックスをクリックするか、データベースからチェックボックスのチェック状態を取得し、それをチェックボックスの正しい状態で表示したい場合のように?

私のアプリでは、データベースからチェックボックスの以前の状態を取得し、リストビューが作成されたときにチェックボックスをその状態に設定しています。ボックスの状態が変更された場合、その状態の変更はデータベースに保存され、チェックボックスには、状態の変化も表示されます。

言い換えれば、getTag 行以外に、コードのそのセクションに何を入れるべきですか?

  if ((convertView == null)){

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.smalltank_customer_row, null);

                holder = new ViewHolder();

                holder.textViewOne = (TextView) convertView.findViewById(R.id.textView1);
                holder.textViewTwo = (TextView) convertView.findViewById(R.id.textView2);
                holder.textViewThree = (TextView) convertView.findViewById(R.id.textView3);
                holder.radioGroupOne = (RadioGroup) convertView.findViewById(R.id.radioGroup1);
                holder.radioButtonOne = (RadioButton) convertView.findViewById(R.id.radioButton1);
                holder.radioButtonTwo = (RadioButton) convertView.findViewById(R.id.radioButton2);
                holder.checkBoxOne = (CheckBox) convertView.findViewById(R.id.checkBox1);
                holder.buttonOne = (Button) convertView.findViewById(R.id.button1);
                holder.buttonTwo = (Button) convertView.findViewById(R.id.button2);
                holder.buttonThree = (Button) convertView.findViewById(R.id.button3);
                holder.buttonFour = (Button) convertView.findViewById(R.id.button4);

                convertView.setTag(holder);

            }else{

                holder = (ViewHolder) convertView.getTag();

            }
4

2 に答える 2

2

convertView は再利用可能であり、一般的に非常に揮発性が高いため、拡張により、その viewHolder も同様に揮発性であるため、チェックボックスの選択などの永続的なデータをそこに保存しないでください。チェックボックスの選択値は、アクティビティが一時停止および再開されたときに保持される場所に保存する必要があります。

例として、アプリで HashSet を使用して、ユーザーが選択した連絡先を保持し、アクティビティが一時停止および再開されたときに保存および復元されます。サンプル コード:

private HashSet<ContactData> selSet = new HashSet<ContactData>();

public View getView(int position, View convertView, ViewGroup parent) {
    if ((convertView == null)){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.smalltank_customer_row, null);

        holder = new ViewHolder();
        //init holder
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }
    holder.status.setChecked(selSet.contains(data));
    return convertView;
}

public void onClick(View v) {
    UserHolder holder = (UserHolder) v.getTag();
    if (selSet.contains(holder.user)) {
        selSet.remove(holder.user);
    } else {
        selSet.add(holder.user);
    }
}

public final void onCreate(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        selSet = (HashSet<ContactData>) savedInstanceState
                .getSerializable("selSet");
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putSerializable("selSet", selSet);
}
于 2013-07-31T10:22:37.280 に答える