gpt4 book ai didi

android - 多选可搜索 ListView

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:00:40 24 4
gpt4 key购买 nike

好的,我有一个可以正常工作的多项选择 ListView。我选中联系人的框(保存在 String[] 中)并且可以正常返回值。因为有些人有很多联系人,所以我想创建一个类似于 Android 电话簿的搜索栏。我创建了一个 EditText 并将其对齐到我的列表上方。我在 StackOverflow 上找到了过滤代码,效果非常好。

我的问题:

当您过滤掉某人的名字并选择该名字时,当您从 EditText 退格或继续输入时,您选择的名字的正确位置不会被保存。例如,如果我开始输入“Adam”并转到“Ada”并选择它,如果我退格以输入“Carol”,则选择“Ada”所在的任何位置。它收集“Adam”在点击时所在的位置(比方说 2),当列表恢复时检查该位置(2),即使 Adam 不在了。我需要一种方法来收集名字.. 然后当列表被恢复或再次搜索时,亚当的名字被选中,而不是亚当以前所在的位置。除了创建大量数组之外,我完全没有其他想法,并且真的需要一些帮助。以下是我正在使用的一些代码:

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contacts_list);


myListView = (ListView)findViewById(android.R.id.list);
search_EditText = (EditText) findViewById(R.id.search_EditText);
search_EditText.addTextChangedListener(filterTextWatcher);

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, ContactsList);
setListAdapter(adapter);

myListView.setItemsCanFocus(false);
getListView().setChoiceMode(2);
myListView.setTextFilterEnabled(true);
myListView.setFastScrollEnabled(true);
myListView.invalidate();
}

private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {

}

public void beforeTextChanged(CharSequence s, int start, int count,
int after) {

}

public void onTextChanged(CharSequence s, int start, int before,
int count) {

adapter.getFilter().filter(s);

}

};

最佳答案

我从来没有找到比我将在下面列出的方法更好的方法。我不再经常使用这段代码,如果有更好的解决方案,我希望有人已经将它发布在某个地方。

我最后做的是创建一个 ArrayList 来保存选定的名称。如果名称被选中,则名称被插入 ArrayList,如果未被选中,则从列表中弹出。选择 afterTextChanged 时,将遍历列表并检查名称是否当前在适配器中列出。当您完成选择过程并想继续时,我清除 EditText 以清除过滤器,因此在 ListView 中填充完整列表并将所有联系人设置为选中(如果它们存在于 ArrayList 中) .

请注意,我对仅列出姓名的联系人列表使用自定义适配器,因此如果您使用其他类型的数据,此解决方案可能会变得更加困惑,我将此方法视为黑客解决方案:

/** Used for filter **/
private TextWatcher filterTextWatcher = new TextWatcher() {

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

ListView listview = getListView();

SparseBooleanArray checked = listview.getCheckedItemPositions();
for (int i = 0; i < ContactsList.length; i++) {
if (checked.get(i) == true) {
Object o = getListAdapter().getItem(i);
String name = o.toString();
// if the arraylist does not contain the name, add it
if (selected.contains(name)){
// Do Nothing
} else {
selected.add(name);
}
}
}
} //<-- End of beforeTextChanged

public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
} //<-- End of onTextChanged

public void afterTextChanged(Editable s) {
ListView listview = getListView();
// Uncheck everything:
for (int i = 0; i < listview.getCount(); i++){
listview.setItemChecked(i, false);
}

adapter.getFilter().filter(s, new Filter.FilterListener() {
public void onFilterComplete(int count) {
adapter.notifyDataSetChanged();
ListView listview = getListView();
for (int i = 0; i < adapter.getCount(); i ++) {
// if the current (filtered)
// listview you are viewing has the name included in the list,
// check the box
Object o = getListAdapter().getItem(i);
String name = o.toString();
if (selected.contains(name)) {
listview.setItemChecked(i, true);
} else {
listview.setItemChecked(i, false);
}
}

}
});
} //<-- End of afterTextChanged

}; //<-- End of TextWatcher

您不想在使用过滤器时使用索引,因为索引 1 可能是一个 ListView 中的内容,而当您更改过滤器。

关于android - 多选可搜索 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5122974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com