0

我有一个带有自定义 ArrayAdapter 的列表视图。我创建了一个自定义的可破解线性布局,到目前为止,这段代码一切都很好:

public ArrayList<FBFriend> getSelectedFriends()
{
    ArrayList<FBFriend> checkedFriends = new ArrayList<FBFriend>();
    SparseBooleanArray checkedItems = m_FriendsListView.getCheckedItemPositions();
    int size = checkedItems != null ? checkedItems.size() : 0;
    for (int i = 0; i < size; i++)
    {
        if (checkedItems.valueAt(i) == true)
        {
            FBFriend selectedFriend = m_FriendsList.get(checkedItems.keyAt(i));
            checkedFriends.add(selectedFriend);
            Log.i(TAG, "Selected Friend:" + checkedItems.keyAt(i) + " - " + selectedFriend.toString());
        }
    }

    return checkedFriends;
}

当我使用这个过滤我的朋友列表时:

public void onInputFriendSearchTextChanged(CharSequence cs, int arg1, int arg2, int arg3)
{
    m_FBFriendsListAdapter.getFilter().filter(cs);
    m_FBFriendsListAdapter.notifyDataSetChanged();
}

上面的方法 ( getSelectedFriends) 返回错误的朋友,因为它考虑了选定的位置而不是选定的 ID。

我在我的适配器中定义了以下内容,希望它会导致该getCheckedItemPositions方法使用 ID:

@Override
public long getItemId(int position)
{
    FBFriend friend = getItem(position);
    return Long.parseLong(friend.getID());
}

@Override
public boolean hasStableIds()
{
    return true;
}

但它没有帮助......

过滤列表适配器时有什么方法可以获取正确的选定项目?

4

1 回答 1

3

发现BUG!!!

原因在于提取所选项目的方法。我用过这个:

FBFriend selectedFriend = m_FriendsList.get(checkedItems.keyAt(i));

但实际上我不能在列表中调用 get 因为它不会跟踪过滤的项目。应该做的是:

FBFriend selectedFriend = m_FriendsListAdapter.getItem(checkedItems.keyAt(i));

所以 ArrayAdapter 实际上会根据过滤器跟踪每个项目的新位置,并将返回正确的项目。

于 2013-08-06T10:53:32.747 回答