Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android,ListView搜索/筛选->;重复条目_Android_Search_Listview_Filter - Fatal编程技术网

Android,ListView搜索/筛选->;重复条目

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

正如标题所解释的,我在筛选/搜索我的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.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);
    }