将 SearchView 用于 ListView 的位置问题 Java
Issue with position using SearchView for a ListView Java
我有一个用这些词填充的列表视图
arrayList.add("apple");
arrayList.add("banana");
arrayList.add("bell");
arrayList.add("cheese");
如果我点击一行,会出现一条消息
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(), arrayList.get(position), Toast.LENGTH_SHORT).show();
}
});
我有一个搜索视图,可以过滤掉不是用户输入的词
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String text = editText.getText().toString().toLowerCase(Locale.getDefault());
adapter.getFilter().filter(text);
}
@Override
public void afterTextChanged(Editable s) {
}
});
如果我在搜索视图中键入 "b",则列表视图中只有 "banana" 和 "bell" 项。但是如果我点击 "banana",Toast 会显示 "apple"。我知道问题是什么以及为什么要这样做,但我不知道解决它的简单方法。
解决这个问题的一种方法是这样...
int textLength = text.length();
if (textLength == 0) {
test.addAll(arrayList);
} else {
int counter = 0;
for (String string : arrayList) {
if (string.toLowerCase().substring(0, textLength).equals(text)) {
test.add(string);
intPositions.add(counter);
}
counter++;
}
}
如果我这样做,我的列表视图的 onClickListener 会更改为这个
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int i = intPositions.get(position);
Toast.makeText(getApplicationContext(), arrayList.get(i), Toast.LENGTH_SHORT).show();
}
});
注意:这仅在用户在单击某行之前在搜索视图中键入内容时有效。
这很好,但是如果我的 arrayList 中有 2000、3000 或 5000 个项目,这不是一个非常有效的方法。感谢任何帮助。
更改以下代码:
Toast.makeText(getApplicationContext(), arrayList.get(position), Toast.LENGTH_SHORT).show();
使用以下代码:
String text = ((TextView) view).getText().toString();
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
我有一个用这些词填充的列表视图
arrayList.add("apple");
arrayList.add("banana");
arrayList.add("bell");
arrayList.add("cheese");
如果我点击一行,会出现一条消息
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(), arrayList.get(position), Toast.LENGTH_SHORT).show();
}
});
我有一个搜索视图,可以过滤掉不是用户输入的词
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String text = editText.getText().toString().toLowerCase(Locale.getDefault());
adapter.getFilter().filter(text);
}
@Override
public void afterTextChanged(Editable s) {
}
});
如果我在搜索视图中键入 "b",则列表视图中只有 "banana" 和 "bell" 项。但是如果我点击 "banana",Toast 会显示 "apple"。我知道问题是什么以及为什么要这样做,但我不知道解决它的简单方法。
解决这个问题的一种方法是这样...
int textLength = text.length();
if (textLength == 0) {
test.addAll(arrayList);
} else {
int counter = 0;
for (String string : arrayList) {
if (string.toLowerCase().substring(0, textLength).equals(text)) {
test.add(string);
intPositions.add(counter);
}
counter++;
}
}
如果我这样做,我的列表视图的 onClickListener 会更改为这个
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int i = intPositions.get(position);
Toast.makeText(getApplicationContext(), arrayList.get(i), Toast.LENGTH_SHORT).show();
}
});
注意:这仅在用户在单击某行之前在搜索视图中键入内容时有效。
这很好,但是如果我的 arrayList 中有 2000、3000 或 5000 个项目,这不是一个非常有效的方法。感谢任何帮助。
更改以下代码:
Toast.makeText(getApplicationContext(), arrayList.get(position), Toast.LENGTH_SHORT).show();
使用以下代码:
String text = ((TextView) view).getText().toString();
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();