【问题标题】:notifyDataSetChanged never worksnotifyDataSetChanged 从不工作
【发布时间】:2012-12-07 20:24:25
【问题描述】:

我一直在寻找年龄并尝试了几个月。我永远不能让我的观点(任何观点)无效。这里有什么问题,谁能告诉我?谁能告诉我如何使用这些无效方法。提前致谢!

                if(result.equals("true"))
                {
                    View row = invoices.getChildAt(info.position);
                    //TextView bgr = (TextView) row.findViewById(R.id.status);
                    //bgr.setBackgroundResource(R.color.blue);
                    //row.setVisibility(View.GONE);

                    Animation anim = AnimationUtils.loadAnimation(Invoices.this, R.anim.down_to_top);
                    anim.setDuration(500);
                    invoices.getChildAt(info.position).startAnimation(anim );
                    final int row_pos = info.position;

                    new Handler().postDelayed(new Runnable() {

                        public void run() {

                            /*row.getInstance().remove(
                                FavouritesManager.getInstance().getTripManagerAtIndex(info.position)
                            );*/
                            ListView invoices = (ListView) findViewById(R.id.allInvoices);
                            View row = invoices.getChildAt(row_pos);
                            row.setVisibility(View.GONE);
                            getAllInvoices();
                            myAdapter.notifyDataSetChanged();

                        }

                    }, anim.getDuration());

                    Toast.makeText(getApplicationContext(), "Deleted!", Toast.LENGTH_SHORT).show();
                }

更新: 这就是我现在得到的。它会移除视图并正确设置动画,但仍然不会失效?

                            ListView invoices = (ListView) findViewById(R.id.allInvoices);
                            View row = invoices.getChildAt(row_pos);
                            HashMap<String, String> lRow = invoice_items.get(row_pos);
                            lRow.remove(row);
                            row.setVisibility(View.GONE);
                            myAdapter.notifyDataSetChanged();

【问题讨论】:

    标签: android invalidation


    【解决方案1】:

    调用notifyDataSetChanged不起作用的原因是数据集没有改变。

    在您的Handler 中,您可以更改ListView 本身的布局。 ListView 只不过是保存数据的Adapter 的表示形式。

    要了解它的工作原理,this post 会解释它。

    将其应用于您的代码将输出如下内容:(PSUEDO)

    Handler {
        lRow = mAdapter.get(row_pos);
        lRow.setVisibilty(false); // visibility is a flag of the row object
        mAdapter = notifyDataSetChanged();
    }
    

    适配器内部:

    getView() {
       if (row.getVisibility){
           // do stuff
       } else {
           // do other stuff 
       }
    }
    

    【讨论】:

    • 更新的问题:) 它删除了所有内容,但仍然没有失效,所以我在 ListView 中间有一个洞呵呵。 编辑: 我刚刚从我的 HashMap 中删除了项目,这可能是它不起作用的原因......但是我到底要如何从适配器中删除它呢?!
    • 您将某种集合提供给您的适配器。例如 Array、List、HashMap。在您的适配器内部,您可以控制 ListView 如何在其视图中呈现数据。如果您从提供给 Adapter 的集合中删除一个对象,您可以使用 notifyDataSetChanged 刷新 Adapter,然后他将更新 ListView。
    【解决方案2】:

    嘿,检查你的 Handler run() 你在哪里再次创建 ListView 而不是设置适配器。您可能会通知适配器,但在创建另一个对象时该适配器未设置为 Listview。我不知道您的 getAllInvoices() 会做什么,但我确信您没有将适配器设置为 listview,因此它永远不会收到通知。根据您的代码,即使在 getAllInvoices() 中也无法设置适配器,因为 listview 是局部变量。

    【讨论】:

    • 但我使用的是同一个适配器,run() 中的 ListView 仅用于查看我需要隐藏哪一行。此外,我只是尝试在 onCreate 之外创建我的 ListView,然后在 onCreate 中对其进行初始化,然后在其他任何地方使用它,但这也不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2021-07-05
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2013-04-19
    • 2021-02-20
    相关资源
    最近更新 更多