0

SimpleCursorAdapterを拡張してカスタムListViewを作成しました。結果は、IMAGE + CheckedTextView(テキスト+チェックボックス)です。

間違ったチェックボックスがチェックされる問題が発生した後(ここを参照)、 lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);を削除する必要がありました。onCreateから。

次に、ListItem行をクリックすると、右側のチェックボックスがオンになります。

私がやろうとしているのは、1つ以上のチェックボックスがチェックされている場合はLinearLayout.VISIBLEを作成し、チェックボックスがチェックされていない場合はLinearLayout.GONEを作成することです。

コードは次のとおりです。

lv.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

CheckedTextView markedItem = (CheckedTextView) view.findViewById(R.id.btitle);

if (!markedItem.isChecked()) {
 markedItem.setChecked(true);

 //show bottom control panel
 findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);


} else {
 markedItem.setChecked(false);

 SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();

 //if no checkbox is checked, hide bottom control panel
 if (lala == null) {
  findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
 }
}
view.refreshDrawableState();
//showSortBtn(markedItem);

}});

これは、listViewをカスタムアダプタにバインドする方法です。

projection = new String[] { Browser.BookmarkColumns._ID,
                Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.TITLE,
                Browser.BookmarkColumns.URL };
        displayFields = new String[] { Browser.BookmarkColumns.TITLE,
                Browser.BookmarkColumns.FAVICON, Browser.BookmarkColumns.URL };
        int[] displayViews = new int[] { android.R.id.icon, android.R.id.text1 };

        cur = managedQuery(BOOKMARKS_URI, projection,
                Browser.BookmarkColumns.BOOKMARK + " == 1", null, Browser.BookmarkColumns.VISITS + " DESC");

        setListAdapter(new ImageCursorAdapter(this,
                android.R.layout.simple_list_item_single_choice, cur,
                displayFields, displayViews));

これには2つの問題があります。

  1. 2つ以上のチェックボックスをオンにしてから、1つだけをオフにすると、LinearLayoutが消えます。つまりSparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();、nullです。他のチェックボックスがオンになっているのに、なぜnullになるのですか?

  2. (やりたいように)に切り替えるfindViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE);、最初のチェックボックスが正しくチェックされ、LinearLayoutがなくなった後、前の質問と同じように、すべてが再び混乱します。

助けに感謝します!

4

1 に答える 1

2

チェックされた項目がない場合に getCheckedItemPositions() が null を返すと予想するのはなぜですか? 選択モードが間違っているようです

A SparseBooleanArray which will return true for each call to get(int position) where position is a position in the list, or null if the choice mode is set to CHOICE_MODE_NONE.

配列は、choice_mode_none の場合にのみ null にする必要があります。

このようなことを試してみませんか?

if (((ListView) parent).getCheckedItemPositions().size() > 0){

    findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.VISIBLE);
else{

    findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE;
}

アップデート

この行に関係があることは間違いありません

 View v = inView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.image_list, null);
        }

ビューを取得したら、そのビューをインフレータに再割り当てします。私はちょっと途方に暮れていますが、なぜそれがあなたが経験している行動を与えるのか正確にはわかりません. bindView()理由はわかりませんが、この方法を試してみることもできます。おそらく、デフォルトの Android レイアウト (setAdapter に与えているもの) を使用する代わりに、独自のレイアウトを作成します。どのビューがどのレイアウトに割り当てられているかについて明らかに混乱しています。

于 2010-10-25T22:48:57.110 に答える