我有一个带有自定义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;
}
但它没有帮助......
过滤列表适配器时获取正确选定项目的任何方法?
答案 0 :(得分:3)
找到了BUG !!!
原因在于提取所选项目的方法。 我用过这个:
FBFriend selectedFriend = m_FriendsList.get(checkedItems.keyAt(i));
但实际上我不能打电话给列表,因为它不会跟踪过滤的项目。 什么sholud做的是:
FBFriend selectedFriend = m_FriendsListAdapter.getItem(checkedItems.keyAt(i));
所以ArrayAdapter实际上根据过滤器跟踪每个项目的新位置,并返回正确的项目。