如何从列表视图中获取从适配器中过滤的已检查项目

时间:2013-08-03 16:14:44

标签: android android-listview android-arrayadapter

我有一个带有自定义ArrayAdapter的列表视图。 我已经创建了一个自定义的chackable线性布局,到目前为止,每个东西都适用于这段代码:

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

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

过滤列表适配器时获取正确选定项目的任何方法?

1 个答案:

答案 0 :(得分:3)

找到了BUG !!!

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

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

但实际上我不能打电话给列表,因为它不会跟踪过滤的项目。 什么sholud做的是:

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

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