【问题标题】:Updating listview when item selected on a spinner在微调器上选择项目时更新列表视图
【发布时间】:2016-05-03 02:25:43
【问题描述】:

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

    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(视为过滤结果)。那是我将其转换为数组并在匹配时将其加载到列表视图的时候。

【问题讨论】:

  • finalArray = gameData.toArray(finalArray); 行有什么作用?您似乎正在将一个空数组 (finalArray) 传递给 ArrayAdapter?请出示gameData的内容。
  • gameData 是一个列表。我在这段代码之前做了一些字符串拆分。 gameData' is converted into array which is finalArray`的内容。它不是一个空数组。
  • @ishmaelMakitla 更新了问题
  • 你总是加到gameData吗?或者任何元素也可以从gameData 中删除?

标签: java android listview spinner


【解决方案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 来查看列表中的更改。

【讨论】:

  • 这仍然不起作用。如果有更多帮助,我已经更新了问题。
  • 我已经看到你更新的代码,我的代码段应该可以工作。无论如何,我正在添加更多细节。
  • 我想我明白你的意思了。我刚刚尝试过并更新了上面的代码。我不确定我的思路是否正确,但它仍然没有更新。
  • finalArray 正在使用新数据集进行更新,对吗?你检查了吗?是的,notifyDataSetChanged 只有在列表发生变化时才会生效。您可以尝试强制更改 finalArray 的大小并检查它是否有效
  • 我刚刚检查过,它在技术上正在更新。它只是在当前列表中添加更多值。正如在 finalArray 中添加了更多值,但列表视图当前仍未更新
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我认为这应该适合你:

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

    【讨论】:

    • 感谢帮助。我只使用 Java 一个星期,不知何故,我认为 ArrayAdapters 只接受数组,但感谢您明确表示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多