notifyDataSetChanged永远不会工作

时间:2012-12-07 11:34:55

标签: android invalidation

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

                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();

2 个答案:

答案 0 :(得分: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 
   }
}

答案 1 :(得分:0)

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