0

我有一个可以正常工作的列表视图。今天我使用此代码向列表视图添加了一个搜索功能

     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,我想在搜索之前返回该项目的位置..不是新职位,有办法解决吗?!

4

1 回答 1

0

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

为什么会很重要?

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

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

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

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 文件的命名方式,您必须依赖列表位置来获取适当的文件。

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

  • 如果您的列表视图填充了 setArrayList或仅 a 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
    }
};

我希望这会有所帮助

于 2013-06-02T07:05:38.063 回答