在微调器上选择项目时更新列表视图

时间:2016-05-02 17:26:34

标签: java android listview spinner

我目前正在使用此方法来过滤列表的结果。我有一个显示数据的微调器,我希望使用所选数据过滤列表视图。

    String[] finalArray = new String[gameData.size()];
    finalArray = gameData.toArray(finalArray);
      // finalArray contains the selection for the spinner
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, finalArray);

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selection = (String)spinner.getSelectedItem();
            for(String str: oldList) {
                if(str.trim().contains(selection))
                    gameData.add(str);
            }
            finalArray = new String[gameData.size()];
            finalArray = gameData.toArray(finalArray);
            arrayAdapter.notifyDataSetChanged();
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

我假设listView.setAdapter(arrayAdapter)一旦做出选择就会更新列表,但它目前没有做任何事情。

    String selection = (String)spinner.getSelectedItem();

    for(String str: oldList) {
        if(str.trim().contains(selection))
            gameData.add(str);
    }

我所做的是将选择设置为字符串。然后我检查oldList是否包含字符串选择。然后我通过oldList来匹配selection,如果它匹配,将它们放入一个新的gameData列表(被视为过滤结果)。当我将其转换为数组并将其加载到列表视图时(如果匹配)。

3 个答案:

答案 0 :(得分:1)

将适配器设置在onItemSelectedListener之外,并在选择了微调项目时调用notifyDataSetChanged

String[] finalArray = new String[gameData.size()];
finalArray = gameData.toArray(finalArray);

// finalArray contains the selection for the spinner
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, finalArray);

// Set the adapter here
listView.setAdapter(arrayAdapter);

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // TODO: Change the elements of finalArray here
        arrayAdapter.notifyDataSetChanged();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
});

检查// TODO:部分。

您需要在此处更改finalArray。完成finalArray中的更改后,即finalArray中添加了新元素后,您可以调用notifyDataSetChanged查看列表中的更改。

答案 1 :(得分:0)

我建议您在设置新适配器之前调用listview.setListAdapter(null)或listview.removeAll()。

答案 2 :(得分:0)

我认为这应该适合你:

String[] finalArray = new String[gameData.size()];
    finalArray = gameData.toArray(finalArray);
      // finalArray contains the selection for the spinner
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, finalArray);
    listView.setAdapter(arrayAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selection = (String)spinner.getSelectedItem();
            for(String str: oldList) {
                if(str.trim().contains(selection))
                    gameData.add(str);
            }
            finalArray = new String[gameData.size()];
            finalArray = gameData.toArray(finalArray);
            arrayAdapter.clear();
            arrayAdapter.addAll(finalArray);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

另外,当ArrayAdapter接受List作为数据参数时,为什么要转换为数组?对于列表,此表单中的某些内容也适用于您:

final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, gameData);
    listView.setAdapter(arrayAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selection = (String)spinner.getSelectedItem();
            for(String str: oldList) {
                if(str.trim().contains(selection))
                    arrayAdapter.add(str);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });