【问题标题】:Listview Search issueListview 搜索问题
【发布时间】:2013-06-02 06:52:02
【问题描述】:

我有一个可以完美运行的列表视图。今天我使用此代码在列表视图中添加了一个搜索功能

     inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text
            MainActivity.this.adapter.getFilter().filter(cs);   
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub                          
        }
    });

问题:我的列表视图中有 114 个项目,所选项目取决于位置,当我搜索并按下我发现的项目时,它将返回位置 1,我想返回该项目的位置在搜索之前..不是新职位,有没有办法解决?!

【问题讨论】:

    标签: android listview search


    【解决方案1】:

    不,它将根据您的列表视图/适配器的当前长度返回项目的位置。

    这有什么关系?

    如果您想根据点击的项目启动不同的活动,有很多方法可以做到。使用列表中的位置选择活动在位置固定时起作用,这不是您的情况,因为用户可以过滤项目。

    相反,根据所点击项目的内容启动活动。

    例如,您的列表视图使用以下项目填充:

    public static final String [] PLANETS = {
            "Mercury",
            "Venus",
            "Earth",
            "Mars",
            "Jupiter",
            "Saturn",
            "Uranus",
            "Neptune",
    };
    

    使用以下ArrayAdapter

    mAdapter = new ArrayAdapter<String>(this, R.layout.simple_list_item_1, R.id.text1, PLANETS);
    

    然后您可以编辑您的OnItemClickListener 以根据所选的实际行星而不是所选位置开始活动。

    private AdapterView.OnItemClickListener mOnPlanetOnItemClickListener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int iistPosition, long l) {
            //Notice I don't get the value from the String array
            //Rather, I tell the adapter to give me the text from the selected item. 
            String planet = mAdapter.getItem(iistPosition);
            Intent newActivity = new Intent(Example.this, NextActivity.class);
            newActivity.putExtra("planet", planet);
        }
    };
    

    如果您使用的是自定义适配器,那就更容易了。

    编辑 不幸的是,由于您的 mp3 文件的命名方式,您必须依赖列表位置来获取适当的文件。

    在这种情况下,您可以尝试一些解决方法,例如:

    • 如果您的列表视图填充了一组ArrayList 或只是一个List,您可以首先获取所选项目的文本,然后根据所选项目的文本获取实际数组位置。

    像这样:

    private AdapterView.OnItemClickListener mOnPlanetOnItemClickListener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int iistPosition, long l) {
            //get the text of the current item
            String planet = mAdapter.getItem(iistPosition);
            //get the position of this planet in the original unfiltered array
            int actualListPosition = PLANETS_ARRAY.indexOf(planet);
            //handle the click based on the actualListPosition
        }
    };
    

    希望对你有帮助

    【讨论】:

    • 因为在我的 setOnItemClickListener 上,我获得了位置并转到另一个活动取决于我选择的项目!
    • if(position+1qurandownloads.com/Audio/Yahya_Hawa/mp3/"+ "00"+(position+1) +".mp3"); } else if(position+ 1qurandownloads.com/Audio/Yahya_Hawa/mp3/"+"0"+(position+1) +".mp3"); } else { new Player() .execute("qurandownloads.com/Audio/Yahya_Hawa/mp3/"+(position+1) +".mp3"); }
    • 非常感谢丹尼尔,但我认为它不适用于我,因为我有一个媒体播放器可以从 url 播放 114 媒体文件,并且 url 有数字,所以这取决于位置检查我上面的代码
    • 清单上的物品来自哪里?一个数组列表?光标?检查我的更新答案
    • 非常感谢,我正在处理 adapter.getitem[position] 上的 switch 语句,然后我发送 int,这是我设置的位置取决于 adapter.getitem[position]。
    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 2014-01-23
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多