Android:list.getCheckEditempositions()は常にnullを返します
-
26-09-2019 - |
質問
SimpleCursoradapterを拡張して、カスタムListViewを作成しました。結果は、Image + CheckedTextView(テキスト +チェックボックス)です。
間違ったチェックボックスがチェックされることに問題がある後(こちらをご覧ください)私は削除する必要がありました lv.setchoicemode(listview.choice_mode_multiple); oncreateから。
次に、リスト項目行をクリックすると、正しいチェックボックスをチェックします。
私がやろうとしているのは、1つ以上のチェックボックスがチェックされているときにlinearlayout.visibleを作成し、[LinearLayout]を作成します。チェックボックスがチェックされていない場合。
これがコードです:
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つの問題があります。
2つ以上のチェックボックスをチェックしてから1つだけチェックすると、LinearLayoutが消えることを意味します。
SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();
無効です。他のチェックボックスがまだチェックされているのに、なぜnullなのですか?切り替えた場合
findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
にfindViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE);
(私がやりたいように)最初のチェックボックスは正しくチェックされており、LinearLayoutがなくなった後、すべてが再び混乱します。 私の前の質問.
どんな助けにも感謝します!
解決
チェックされたアイテムがない場合、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.
Arrayは、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に提供するレイアウトを使用する代わりに、独自のレイアウトを作成します。どのビューがどのレイアウトに割り当てられているかについて明らかに混乱しています。