【问题标题】:How can I get notifyDataSetChanged() to start working?如何让 notifyDataSetChanged() 开始工作?
【发布时间】:2013-07-14 00:00:29
【问题描述】:

我正在尝试根据另一个微调器中的项目选择来更改微调器的值。用于填充两个微调器的值位于一个名为 array.xml 的 xml 文件中。数组文件看起来像

<string-array name="eventYear">
       <item>2010</item>
       <item>2010</item>
       <item>2010</item>
   </string-array>
   <string-array name="eventName">
        <item>something</item>
        <item>something</item>
        <item>something</item>
        <item>something</item>
        .
        .
        .
    </string-array>

这里是onCreate方法和其他相关代码

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_report_selection);

        // Display UI Elements
        Log.v("RS", "Displaying Headers and Form");
        headerText = (TextView) findViewById(R.id.headerTextView);
        subheaderText = (TextView) findViewById(R.id.subHeaderTextView);
        headerForm = (LinearLayout) findViewById(R.id.headerForm);

        // For Event Year
        yearTextView = (TextView) findViewById(R.id.yearTextView);
        yearSpinner = (Spinner) findViewById(R.id.yearSpinner);
        adapter0 = ArrayAdapter.createFromResource(
                ReportSelectionActivity.this, R.array.eventYear,
                android.R.layout.simple_spinner_dropdown_item);
        adapter0.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        yearSpinner.setAdapter(adapter0);
        // When a year is selected change the options in the event name spinner
        yearSpinner.setOnItemSelectedListener(new myOnItemSelectedListner());

        // For Event Names
        nameTextView = (TextView) findViewById(R.id.nameTextView);
        nameSpinner = (Spinner) findViewById(R.id.nameSpinner);
        ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
                ReportSelectionActivity.this, R.array.plzSelect,
                android.R.layout.simple_spinner_dropdown_item);
        adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        nameSpinner.setAdapter(adapter1);

        // Add table rows to view
        yearTableRow = (TableRow) findViewById(R.id.yearTableRow);
        nameTableRow = (TableRow) findViewById(R.id.nameTableRow);
    }

adapter0 是一个全局变量

private class myOnItemSelectedListner implements OnItemSelectedListener {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            int count = 0;

            if (count >= 1) {
                // TODO Auto-generated method stub
                // Get the year selected from the spinner
                int data = Integer.parseInt(yearSpinner.getItemAtPosition(arg2)
                        .toString());
                Log.v("RS", "Data: " + data);
                // Depending on which year has been selected intialize the
                // new adapter and set it for the event name spinner
                switch (data) {
                case 2010:
                    adapter0 = ArrayAdapter.createFromResource(
                            ReportSelectionActivity.this,
                            R.array.eventName2010,
                            android.R.layout.simple_spinner_dropdown_item);
                case 2011:
                    adapter0 = ArrayAdapter.createFromResource(
                            ReportSelectionActivity.this,
                            R.array.eventName2011,
                            android.R.layout.simple_spinner_dropdown_item);
                case 2012:
                    adapter0 = ArrayAdapter.createFromResource(
                            ReportSelectionActivity.this,
                            R.array.eventName2012,
                            android.R.layout.simple_spinner_dropdown_item);
                default:
                    adapter0 = ArrayAdapter.createFromResource(
                            ReportSelectionActivity.this, R.array.plzSelect,
                            android.R.layout.simple_spinner_dropdown_item);
                }
                // Add adapter to spinner
                adapter0.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                nameSpinner.setAdapter(adapter0);
                // Change UI view
                adapter0.notifyDataSetChanged();
            }// End of if statment
            count++;

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    }// End of private class myOnItemSelectedListener

那么为什么 notifyDataSetChanged() 不起作用?

更新代码

private class myOnItemSelectedListner implements OnItemSelectedListener {
        ArrayAdapter<CharSequence> adapter;
        String[] array;

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // Log.v("RS", "In on onItemSelected");
            // TODO Auto-generated method stub
            // int count = 0;

            /* if (count >= 1) { */
            // TODO Auto-generated method stub
            // Get the year selected from the spinner
            int data;
            try{
             data = Integer.parseInt(yearSpinner.getItemAtPosition(arg2)
                    .toString());
            }catch(NumberFormatException e){
                data = 0;
            }
            Log.v("RS", "Data: " + data);
            // Depending on which year has been selected intialize the
            // new adapter and set it for the event name spinner
            switch (data) {
            case 2010:
                Log.v("RS", "Case 2010");
                adapter1.clear();
                array = getResources().getStringArray(R.array.eventName2010);
                list = new ArrayList<String>(Arrays.asList(array));
                adapter1.add((CharSequence) list);
                /*
                 * = ArrayAdapter.createFromResource(
                 * ReportSelectionActivity.this, R.array.eventName2010,
                 * android.R.layout.simple_spinner_dropdown_item)
                 */
                ;
            case 2011:
                Log.v("RS", "Case 2011");
                adapter1.clear();
                array = getResources().getStringArray(R.array.eventName2011);
                list = new ArrayList<String>(Arrays.asList(array));
                adapter1.add((CharSequence) list);
                /*
                 * adapter0 = ArrayAdapter.createFromResource(
                 * ReportSelectionActivity.this, R.array.eventName2011,
                 * android.R.layout.simple_spinner_dropdown_item);
                 */
            case 2012:
                Log.v("RS", "Case 2012");
                adapter1.clear();
                array = getResources().getStringArray(R.array.eventName2012);
                list = new ArrayList<String>(Arrays.asList(array));
                adapter1.add((CharSequence) list);
                /*
                 * adapter0 = ArrayAdapter.createFromResource(
                 * ReportSelectionActivity.this, R.array.eventName2012,
                 * android.R.layout.simple_spinner_dropdown_item);
                 */
            default:
                Log.v("RS", "Case default");
                adapter1.clear();
                array = getResources().getStringArray(R.array.plzSelect);
                list = new ArrayList<String>(Arrays.asList(array));
                adapter1.add((CharSequence) list);
                /*
                 * adapter0 = ArrayAdapter.createFromResource(
                 * ReportSelectionActivity.this, R.array.plzSelect,
                 * android.R.layout.simple_spinner_dropdown_item);
                 */
            }
            // Add adapter to spinner

            adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            nameSpinner.setAdapter(adapter1);

            // Change UI view
            // Log.v("RS", "notifying view of change");
            adapter1.notifyDataSetChanged();
            /*
             * }// End of if statment
             */
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    }// End of private class myOnItemSelectedListener

【问题讨论】:

  • 如果您每次更改适配器时都重新创建适配器,那么 notifyDataSetChanged 是多余的
  • @eskimoapps.com 在我添加 notifyDataSetChanged 之前它不起作用。我在网上看到了,觉得应该可以。我的理解是,要在视图中显示更改,我必须使用 notifyDataSetChanged()。
  • 如果您将数据更改为现有适配器,因为您正在重新创建它,但情况并非如此。您是否检查过您的 switch 语句是否正确执行?
  • @eskimoapps.com。到目前为止,我尝试过的所有示例都没有奏效。现在我正在使用 clear(),然后 add(),然后我使用 notifyDataSetChanged()。我只是将 switch 语句中的部分更改为使用前面所述的方法 instedad 重新创建 arrayadapter。
  • 这可能是一个更好的方法,但这不是导致您的问题的原因,请查看我的答案

标签: android android-arrayadapter android-spinner onitemclicklistener notifydatasetchanged


【解决方案1】:
int count = 0;
if (count >= 1) {

如果您事先将其设置为 0,显然 count 永远不会 >= 1

【讨论】:

  • Log.v("RS", "Data:" + data);这个输出什么?
  • 我用来查看我是否真的从第一个微调器获得了正确的信息
【解决方案2】:

您正在一个开关内创建适配器0,该开关位于一个 if 内,它永远不会通过,因为您有:

int count = 0;

if (count >= 1) {

希望这会有所帮助...

【讨论】:

  • @user2127364 好的,现在尝试将您的交换机组中的适配器 0 替换为适配器 1,看看效果如何...
  • 我做到了。我还在网上找到了另一个例子,它说使用 clear、add 和 notifyDataSetChanged 更好。所以我实现了这一点。现在我收到一个 numberformatexception 错误。但是,我添加了一个 try catch 块,应该可以防止这种情况发生,但我仍然收到该错误。我将添加我对初始帖子所做的更改。
  • @user2127364 尝试使用 Integer.valueOf 而不是 Integer.parseInt 并删除以下行:adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);和 nameSpinner.setAdapter(adapter1);从你的交换机结束,他们就不需要了。你的方法是 goog 我认为问题出在数据变量上。您是否还注意到 xml 中的 eventYear 数组仅包含 2010 年?
  • 我按照您的建议进行了更改。现在,当它到达 clear() 时,它给了我一个不受支持的操作异常。
  • 好的,这意味着您的问题首先不是 notifyDataSetChanged,而是将字符串解析为整数。您现在可以做的是对适配器进行一些操作,也许可以做您之前所做的(重新创建适配器并将其重置为微调器)。但是,如果您仍然有问题,您必须发布一个新问题。干杯!
猜你喜欢
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多