#android #search #listview #filter
#Android #Поиск #просмотр списка #Фильтр
Вопрос:
КАК объясняется в названии, у меня возникли проблемы с фильтрацией / поиском в моем listview. Когда я пытаюсь выполнить поиск, скажем, «A», в ListView два раза отображается A-31, A-32 два раза и так далее. У кого-нибудь есть идея, почему это происходит?
package hpliu.grupp2;
import android.content.Intent;
import android.os.Bundle;
import android.os.Debug;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.TableRow;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.ListActivity;
import android.app.Activity;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class SearchRoomActivity extends ListActivity {
private EditText filterText = null;
SimpleAdapter menu = null;
ListView lv = null;
static final String[] AHalls = new String[] { "A-31", "A-32", "A-33",
"A-34", "A-35", "A-36", "A-37" };
String[] from = new String[] { "roomName", "buildingName" };
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_room);
createCampusList("Campus Valla, Linköping",
createHashMap(AHalls, "A Huset"));
// filterText = (EditText) findViewById(R.id.search_box);
// filterText.addTextChangedListener(filterTextWatcher);
}
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
menu.getFilter().filter(s);
}
};
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
try {
@SuppressWarnings("unchecked")
HashMap<String, String> toHash = (HashMap<String, String>) this
.getListAdapter().getItem(position); // {text1 = "A-31",
// text2 = "Herp"};
Toast.makeText(
this,
"Searching for... " " "
toHash.get("roomName").toString(),
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
public List<HashMap<String, String>> createHashMap(String[] Halls,
String Building) {
List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < Halls.length; i ) {
HashMap<String, String> map = new HashMap<String, String>();
map.put(from[0], Halls[i]);
map.put(from[1], Building);
fillMaps.add(map);
}
return fillMaps;
}
public List<HashMap<String, String>> createHashMap(String[] Halls,
String[] Buildings) {
List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < Halls.length; i ) {
HashMap<String, String> map = new HashMap<String, String>();
map.put(from[0], Halls[i]);
map.put(from[1], Buildings[i]);
fillMaps.add(map);
}
return fillMaps;
}
public void createCampusList(String campusHeader,
List<HashMap<String, String>> fillMaps) {
int[] to = new int[] { R.id.roomName, R.id.buildingName };
menu = new SimpleAdapter(this, fillMaps, R.layout.list_item, from, to);
setListAdapter(menu);
lv = getListView();
lv.setTextFilterEnabled(true);
}
@Override
protected void onDestroy() {
super.onDestroy();
filterText.removeTextChangedListener(filterTextWatcher);
}
}
Ответ №1:
Если вы фильтруете адаптер, который содержит две строки в каждом элементе, фильтр будет проходить через адаптер дважды. Вот почему у вас есть кратные. Если бы у вас было по три строки в каждой, вы могли бы получить три повторяющихся элемента.
Одним из решений, которое я нашел в Интернете, было создание пользовательского SimpleAdapter и проверка на наличие дубликатов перед заполнением вашего ListView.
Ответ №2:
Мой пользовательский listview столкнулся с той же проблемой.
Суперкласс listview не знает, что вы изменили размер при фильтрации. Это означает, что getCount() вернет исходный размер массива, который по понятным причинам больше, чем ваш отфильтрованный массив. Таким образом, вы должны переопределить функцию getCount(), чтобы вернуть размер отфильтрованного массива, а не исходного массива. После этого дублированные элементы исчезли.
@Override
public int getCount() {
return filter_array.size();
}
@Override
public Object getItem(int position) {
return filter_array.get(position);
}