我通过扩展SimpleCursorAdapter创建了一个自定义ListView。结果是IMAGE + CheckedTextView(文本+复选框)。
我遇到错误的复选框问题(see here)后,我不得不从onCreate中删除 lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 。
现在我点击ListItem行,它会选中右侧复选框。
我要做的是在选中一个或多个复选框时进行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个或更多复选框,然后只取消选中一个,则LinearLayout将消失,这意味着SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();
为空。如果还检查了其他复选框,为什么它为空?
如果我将findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);
切换到findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE);
(就像我想做的那样),正确检查第一个复选框,并且在LinearLayout为GONE之后,一切都再次变得混乱,就像在my previous question
感谢任何帮助!
答案 0 :(得分: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);
}
您获得视图,然后将视图重新分配给inflater。我有点不知所措,不知道为什么它会给你的行为带来琐事。您可能还想尝试bindView()
方法,但我不确定原因。也许不是使用默认的android布局(你给setAdapter提供的布局,而是制作自己的布局。很明显,对哪个布局分配给哪个布局感到困惑。