【问题标题】:notifyDataSetChanged not work in my activitynotifyDataSetChanged 在我的活动中不起作用
【发布时间】:2016-11-09 12:11:46
【问题描述】:

在我的代码中,当删除列表视图的行时列表视图不会改变。我使用 adapter.notifyDataSetChange() 但它不是 word。这是我的代码:代码使类的位置不同。

CustomList adapter;
Integer[] imageId;
public String[] _Data2;
 public int positionAll;
ArrayList<ArrayList<String>> _Data = new ArrayList<ArrayList<String>>();
DataBase data = new DataBase(Show_Code.this, "MELK_TBL");


 try {
        data.open();
        _Data = data.GetData();
        imageId = new Integer[_Data.size()];
        _Data2 = new String[_Data.size()];
        for (int i = 0; i < _Data.size(); i++) {
            imageId[i] = R.drawable.municipal;
            _Data2[i] = _Data.get(i).get(1) + "_" + _Data.get(i).get(2) + "_" + _Data.get(i).get(3) + "_" + _Data.get(i).get(4) + "_" + _Data.get(i).get(5) + "_" + _Data.get(i).get(6) + "_0";
        }
        adapter = new CustomList(Show_Code.this, _Data2, imageId);
        data.close();
    } catch (Exception e) {
        Toast.makeText(getApplication(), e.toString(), Toast.LENGTH_LONG).show();
    }

    list.setAdapter(adapter);



list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view,
                                       int position, long id) {

            try {
                data.open();
                data.Delete(_Data.get(position).get(1), _Data.get(position).get(2), _Data.get(position).get(3), _Data.get(position).get(4), _Data.get(position).get(5), _Data.get(position).get(6), _Data.get(position).get(7));
                data.close();
                adapter.notifyDataSetChanged();
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
            }
            return true;
        }
    });

请帮帮我,我没时间 :(

【问题讨论】:

    标签: android notifydatasetchanged


    【解决方案1】:

    由于 Array 的大小在运行时不会更改,因此您需要创建新适配器并再次设置为列表 您必须在 onItemLongClick 中添加此代码

    data.open();
            _Data = data.GetData();
            imageId = new Integer[_Data.size()];
            _Data2 = new String[_Data.size()];
            for (int i = 0; i < _Data.size(); i++) {
                imageId[i] = R.drawable.municipal;
                _Data2[i] = _Data.get(i).get(1) + "_" + _Data.get(i).get(2) + "_" + _Data.get(i).get(3) + "_" + _Data.get(i).get(4) + "_" + _Data.get(i).get(5) + "_" + _Data.get(i).get(6) + "_0";
            }
            adapter = new CustomList(Show_Code.this, _Data2, imageId);
            data.close();
            list.setAdapter(adapter)
    

    【讨论】:

      【解决方案2】:

      您正在适配器中传递_Data2 对象。从数据中删除后,您应该更新相同的对象。尝试在onItemLongClick(AdapterView&lt;?&gt; parent, View view,int position, long id) 方法中的data.close() 之前添加这个:

      _Data = data.GetData();
      imageId = new Integer[_Data.size()];
      _Data2.clear();
      for (int i = 0; i < _Data.size(); i++) {
           imageId[i] = R.drawable.municipal;
           _Data2[i] = _Data.get(i).get(1) + "_" + _Data.get(i).get(2) + "_" + _Data.get(i).get(3) + "_" + _Data.get(i).get(4) + "_" + _Data.get(i).get(5) + "_" + _Data.get(i).get(6) + "_0";
      }
      

      不要创建_Data2 的新对象。只需清除同一个对象并再次在其中添加整个数据,然后您可以调用adapter.notifyDataSetChanged() 然后它会自动更新。

      【讨论】:

      • _Data2 的大小会和之前一样吗?没有权利?您应该为它使用 ArrayList ,这样当它更新时,它会在您的适配器中自动更新 notifyDataSetChange。
      • 我通过将 _Data2 定义为 arraylist 来更改代码并更改您的代码,但它不再起作用
      【解决方案3】:

      删除值后,您需要传递已删除所有这些值的新数组列表,然后通知适配器类。在您的情况下,请参阅以下代码

      list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
      
              @Override
              public boolean onItemLongClick(AdapterView<?> parent, View view,
                                             int position, long id) {
      
                  try {
                      data.open();
                      data.Delete(_Data.get(position).get(1));
                      data.close();
                      **//Edited code...**
                       _Data.get(position).remove(1);
                       adapter.refreshView(_Data);
                       **//Edited code...**
                  } catch (Exception e) {
                      Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
                  }
                  return true;
              }
          });
      

      并且在适配器类中的 refreshview 方法将如下所示,

          public void refreshView(String[] _Data) {
          this._Data = _Data;
           notifyDataSetChanged();
          }
      

      通过这种方式可以通知数据。例如我只删除了一个值并通知。

      希望这有帮助:)

      【讨论】:

      • @amardco:您需要从活动中的字符串数组中删除已删除的值。即,在您的情况下,_Data2 是字符串数组。因此,您必须从_Data2 中删除已删除的值,并且需要将适配器字符串数组值替换为新数组,然后通知适配器。它会起作用,这就是我在这里解释的。在您的情况下,您已删除活动中的值,但尚未将该值传递给适配器,这就是通知不起作用的原因。
      • @amardco: 快乐是我的 :)
      【解决方案4】:

      您需要重新组织代码,使用方法,仅用于再次选择您的数据并执行 list.setAdapter(adapter); 然后使用 adapter.notifyDataSetChanged();

      【讨论】:

      • 当然可以,但是您需要从数据库中重新加载对象,使用当前数据重置适配器,然后才能使用notifyDataSetChanged()
      猜你喜欢
      • 2019-05-23
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多