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

Updating listview when item selected on a 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 (被视为过滤结果)。那是我将它转换成一个数组并在匹配时将其加载到列表视图的时候。

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 来查看列表中的更改。

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

我认为这对你有用:

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) {

        }
    });