Android,ListView搜索/筛选->;重复条目
正如标题所解释的,我在筛选/搜索我的listview时遇到了问题。当我尝试搜索let(比如“A”)时,listView显示A-31两次,A-32两次,以此类推。有人知道为什么会这样吗Android,ListView搜索/筛选->;重复条目,android,search,listview,filter,Android,Search,Listview,Filter,正如标题所解释的,我在筛选/搜索我的listview时遇到了问题。当我尝试搜索let(比如“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.Tex
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);
}
}
包hpliu.grupp2;
导入android.content.Intent;
导入android.os.Bundle;
导入android.os.Debug;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.view.view;
导入android.widget.TableRow;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入android.app.ListActivity;
导入android.app.Activity;
导入android.widget.EditText;
导入android.widget.ListView;
导入android.widget.simpledapter;
导入android.widget.Toast;
公共类SearchRoomActivity扩展了ListActivity{
private EditText filterText=null;
SimpleAdapter菜单=空;
ListView lv=null;
静态最终字符串[]AHalls=新字符串[]{“A-31”、“A-32”、“A-33”,
“A-34”、“A-35”、“A-36”、“A-37”};
字符串[]from=新字符串[]{“roomName”,“buildingName”};
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、搜索室);
创建校园列表(“校园瓦拉,林克ö平”,
createHashMap(AHalls,“Huset”);
//filterText=(EditText)findViewById(R.id.search_框);
//filterText.addTextChangedListener(filterTextWatcher);
}
私有TextWatcher filterTextWatcher=新TextWatcher(){
公共无效后文本已更改(可编辑){
}
更改前的公共无效(字符序列、整数开始、整数计数、,
整数后){
}
@凌驾
public void onTextChanged(字符序列,int start,int before,
整数计数){
menu.getFilter().filter;
}
};
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id){
super.onListItemClick(左、右、位置、id);
试一试{
@抑制警告(“未选中”)
HashMap toHash=(HashMap)此
.getListAdapter().getItem(位置);//{text1=“A-31”,
//text2=“Herp”};
Toast.makeText(
这
“正在搜索…”+“”
+toHash.get(“roomName”).toString(),
吐司。长度(短)。show();
}捕获(例外e){
e、 printStackTrace();
}
}
公共列表createHashMap(字符串[],
弦(建筑){
List fillMaps=new ArrayList();
对于(int i=0;i<1.length;i++){
HashMap=newHashMap();
地图放置(从[0],大厅[i]);
地图放置(从[1],建筑);
fillMaps.add(map);
}
返回填充图;
}
公共列表createHashMap(字符串[],
字符串[]建筑物){
List fillMaps=new ArrayList();
对于(int i=0;i<1.length;i++){
HashMap=newHashMap();
地图放置(从[0],大厅[i]);
地图放置(从[1],建筑物[i]);
fillMaps.add(map);
}
返回填充图;
}
public void createCampusList(字符串campusHeader,
列表(地图){
int[]to=newint[]{R.id.roomName,R.id.buildingName};
菜单=新建SimpleAdapter(此、fillMaps、R.layout.list_项、从、到);
setListAdapter(菜单);
lv=getListView();
lv.setTextFilterEnabled(真);
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
filterText.removeTextChangedListener(filterTextWatcher);
}
}
如果筛选每个项目中有两个字符串的适配器,则筛选器将通过适配器两次。这就是为什么你有倍数。如果每个字符串中有三个字符串,则可能会得到三个重复项
我在网上找到的一个解决方案是创建一个自定义SimpleAdapter,并在填充ListView之前检查重复项。我的自定义ListView也面临同样的问题 listview的超类不知道您在过滤后更改了大小。这意味着getCount()将返回数组的原始大小,可以理解它比过滤后的数组大。因此,必须重写getCount()函数以返回过滤数组的大小,而不是原始数组的大小。之后,重复的项目消失了
@Override
public int getCount() {
return filter_array.size();
}
@Override
public Object getItem(int position) {
return filter_array.get(position);
}