Android:list.getCheckedItemPositions()始终返回null

时间:2010-10-25 22:13:32

标签: android android-listview

我通过扩展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));

我有两个问题:

  1. 如果我选中2个或更多复选框,然后只取消选中一个,则LinearLayout将消失,这意味着SparseBooleanArray lala = ((ListView) parent).getCheckedItemPositions();为空。如果还检查了其他复选框,为什么它为空?

  2. 如果我将findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.INVISIBLE);切换到findViewById(R.id.bottom_control_bar).setVisibility(LinearLayout.GONE);(就像我想做的那样),正确检查第一个复选框,并且在LinearLayout为GONE之后,一切都再次变得混乱,就像在my previous question

  3. 感谢任何帮助!

1 个答案:

答案 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提供的布局,而是制作自己的布局。很明显,对哪个布局分配给哪个布局感到困惑。