从服务中删除ListView中的项目会导致很多错误

时间:2016-03-16 14:59:33

标签: android listview

我有ListView of Persons,ArrayAdapter来显示这些人的图像。有两个按钮"喜欢"并且"不喜欢"在每个人的照片下。如果我按下喜欢或不喜欢按钮,则此项目将从列表中删除动画:

protected void removeListItem(View rowView, final int positon) {
    Animation out = AnimationUtils.makeOutAnimation(getActivity(), true);
    rowView.startAnimation(out);
    rowView.setVisibility(View.INVISIBLE);
    Handler handle = new Handler();
    handle.postDelayed(new Runnable() {

        public void run() {
            persons.remove(positon);
            mMyAnimListAdapter.notifyDataSetChanged();
        }
    }, 500);
}

还有一些API可以生成我们可以获得的人员列表。此API会对列表进行更改(状态更改为下一个值之一:"无","已删除","已删除"不喜欢") 。 如果状态更改为"已删除"我需要从列表中删除此人并更新ListView。我是这样做的:

if (changedPerson.getStatus().equals("removed")) {
   persons.remove(index);
   mMyAnimListAdapter.notifyDataSetChanged();
   notifyRemovedStatus(idOfChangedPerson); 
}

但是当我这样做时,发生了很多错误:

  1. 仅在点击后列出更新。
  2. 如果最后一项从列表中删除,则片段不会关闭。
  3. ArrayIdexOfBound如果我们按下喜欢/不喜欢按钮,有时会发生异常。
  4. 你能帮助我吗,为什么要这样做?以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

解决方案很简单,这里的代码没有错误:

if (changedPerson.getStatus().equals("removed")) {
   persons.remove(index);
   getActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
         mMyAnimListAdapter.notifyDataSetChanged();
         if (persons.size() == 0) {
            getActivity().onBackPressed();
         }
      }});
   notifyRemovedStatus(idOfChangedPerson);
}

我违反了此规则"请勿从UI线程外部访问Android UI工具包"

此视频介绍了工作概念: https://www.udacity.com/course/viewer#!/c-ud853/l-1469948762/e-1530568562/m-1530568563

此文档非常有用:http://developer.android.com/guide/components/processes-and-threads.html