0

解決するには、次のフローが必要です。リストビューアイテムのチェックボックスのいずれかをタップしてチェックすると、削除ボタンが表示されます。すべてのチェックボックスをオフにすると、削除ボタンが消えるはずです。私の問題は、setOnCheckedChangeListenerを作成してDeleteを表示/終了すると、チェックボックスビューで、リストビューをスクロールした後、自動的にチェックが外れ、画面に表示されなくなることです( `ビューをリサイクルするため) 。

total_number_of_checkboxes_checked変数を取得する方法に関するアイデア。これは、1で増減します(画面に表示されているチェックボックスだけでなく、チェックされているすべてのチェックボックスを数えます)。

編集:追加されたコード


アダプタ


public class AdminNotesAdapter extends BaseAdapter {

private ArrayList<AdminNoteShortenHolder> mNotesList = new ArrayList<AdminNoteShortenHolder>();

private AdminNoteShortenHolder mNoteHolder = new AdminNoteShortenHolder();
private ViewHolder holder = null;

private Activity activity;

public AdminNotesAdapter(ArrayList<AdminNoteShortenHolder> array,
        Activity activity) {
    this.activity = activity;
    this.mNotesList = array;

}

@Override
public int getCount() {
    return mNotesList.size();
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    mNoteHolder = mNotesList.get(position);

    if (convertView == null) {
        convertView = activity.getLayoutInflater().inflate(
                R.layout.row_adminnotes, null);
        holder = new ViewHolder(convertView);
        holder.cb_row_adminNotesCheck
                .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        int getPosition = (Integer) buttonView.getTag();
                        mNotesList.get(getPosition).setSelected(isChecked);

                    }
                });
        convertView.setTag(holder);
        convertView.setTag(R.id.cb_row_adminnotesCheck,
                holder.cb_row_adminNotesCheck);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.img_row_adminnotesNew
            .setVisibility(0 == mNoteHolder.note_read ? View.VISIBLE
                    : View.GONE);

    holder.txt_row_adminnotesNoteSubject.setText(mNoteHolder.note_subject);
    holder.txt_row_adminnotesNoteUser.setText("from "
            + mNoteHolder.note_from_user + " | " + mNoteHolder.note_time);
    holder.txt_row_adminnotesNotePreview.setText(mNoteHolder.note_content);

    holder.cb_row_adminNotesCheck.setTag(position);
    holder.cb_row_adminNotesCheck.setChecked(mNotesList.get(position)
            .isSelected());

    return convertView;
}

static class ViewHolder {

    public ImageView img_row_adminnotesNew;
    public TextView txt_row_adminnotesNoteSubject;
    public TextView txt_row_adminnotesNoteUser;
    public TextView txt_row_adminnotesNotePreview;
    public CheckBox cb_row_adminNotesCheck;

    public ViewHolder(View convertView) {

        img_row_adminnotesNew = (ImageView) convertView
                .findViewById(R.id.img_row_adminnotesNew);

        txt_row_adminnotesNoteSubject = (TextView) convertView
                .findViewById(R.id.txt_row_adminnotesNoteSubject);
        txt_row_adminnotesNoteUser = (TextView) convertView
                .findViewById(R.id.txt_row_adminnotesNoteUser);
        txt_row_adminnotesNotePreview = (TextView) convertView
                .findViewById(R.id.txt_row_adminnotesNotePreview);
        cb_row_adminNotesCheck = (CheckBox) convertView
                .findViewById(R.id.cb_row_adminnotesCheck);

    }

}
}

AdminNoteShortenHolder(モデルクラス)

public class AdminNoteShortenHolder extends BaseHolder {

public int note_id;
public String note_from_user;
public String note_subject;
public String note_content;
public String note_time;
public int note_read;

private boolean selected;

@Override
public void parse(JSONObject jsonObject) {

    note_id = jsonObject.optInt("note_id", -1);
    note_from_user = jsonObject.optString("note_from_user");
    note_subject = jsonObject.optString("note_subject");
    note_content = jsonObject.optString("note_content");
    note_time = jsonObject.optString("note_time");
    note_read = jsonObject.optInt("note_read", -1);
}

public boolean isSelected() {

    return selected;
}

public void setSelected(boolean selected) {
    this.selected = selected;
}
}

これは私がこれまでに行ったことであるため、setTag / getTagを使用して、ListViewのスクロール中にCheckBoxesステータスを維持することができました。問題は、アクティビティに削除ボタンがあり、少なくとも1つのチェックボックスがオンになっている、またはチェックされていない場合に表示/削除する必要があることです。アイデアがあればお知らせください。

4

1 に答える 1

0

リストビューを上下にスクロールすると、すべてのリストアイテムがリストアダプタによって再作成されるため、「チェック済み」チェックボックスの状態を維持/保持して、上下にスクロールしてもチェックされたままにする必要があります。

hashMapを使用して、list-itemをs KEYとして保持し、「Checked」ステータスを値として保持できます。ユーザーがチェックボックスをオンにすると、キー値をマップに追加し、ユーザーがチェックボックスをオフにすると、キーをマップから削除します。

このマップをレンダリングリストビューで使用します。コードは以下の通りです:

private Map<Integer, Boolean> map =  new HashMap<Integer, Boolean>();    

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

     Boolean present = map.get(position);
     if(present != null && present.booleanValue()){
       // set checkbox checked
     } else {
       // set checkbox un-cheked
     }

     holder.cb_row_adminNotesCheck.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (Integer) buttonView.getTag();
                    mNotesList.get(getPosition).setSelected(isChecked);
                    if(isChecked){
                       map.put(position, true);
                    } else {
                       map.remove(position);
                    }
                    setButtonVisibility();
                }
     });
}

 private void setButtonVisibility()
 {
    if(map.size() > 0){
       // set button visible
    } else {
       // set button invisible
    }
 }
于 2013-03-05T12:18:33.680 に答える