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));

我对此有两个问题:

  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 消失之后,一切又变得一团糟,就像我之前的问题一样。

感谢任何帮助!

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 时,该数组才应该为空。

为什么不尝试这样的事情呢?

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 回答