调用notifyDataSetChanged()后如何在ListView中设置文本

时间:2018-07-04 14:18:08

标签: java android listview notifydatasetchanged

方案::我有一个 ListView ,当用户单击孩子时,它会在其中设置 TextView 的值主要活动中 ListView 的内容。

我有一个 FloatingActionButton ,该对象会添加和减去一个对象以计算 ListView 中的项目数量。

要添加或减去 ListView 显示的子项数量,我呼叫notifyDataSetChanged()

我正在尝试设置调用notifyDataSetChanged()后输入到 TextView 中的文本


问题notifyDataSetChanged()在将TextView重置为空白后 它完成运行。

我尝试过的事情:我尝试将 ListView 项中的所有值保存到单独的String[] savedItems中,并在< em> TextView 。我已经在调试器中逐步运行了代码,看到代码正在保存文本并实际设置文本,但是由于某些原因,notifyDataSetChanged()尚未完成其工作。

notifyDataSetChanged()完成后如何设置文本?


有问题的代码:

public void addNewThought(int numberOfThoughts) {
    String[] savedDistortionsList = saveDistortions(); // This saves each childs text

    selectedItems[numberOfThoughts] = new ArrayList<String>();
    IntegerNumberOfThoughts.add(Integer.toString((numberOfThoughts++)) ); // Just the variable that counts the number of children needed in ListView

    distortionsAdapter.notifyDataSetChanged(); // Refresh ListView
    setBackDistortionsList(savedDistortionsList); // Put back text into ListView
}

saveDistortions()有效,所以我认为没有必要显示,但是这里是我测试过的setBackDistortionsList()的代码,它实际上是在ListView中设置TextView,但实际上并没有由于某种原因显示。

setBackDistortionsList

private void setBackDistortionsList(String[] savedDistortionsList) {
    View tempView;
    TextView tempTextView;
    for (int i = 0; i < savedDistortionsList.length; i++) {
        tempView = LDistortions.getChildAt(i);
        tempTextView = (TextView) tempView.findViewById(R.id.textEntry);
        tempTextView.setText(savedDistortionsList[i]);
    }
}

1 个答案:

答案 0 :(得分:0)

在这里找到答案: How do I check when my ListView has finished redrawing?

从用户@Petro复制并粘贴

希望这会有所帮助:

  • 在列表视图上设置addOnLayoutChangeListener
  • 致电.notifyDataSetChanged();
  • 一旦完成,这将触发OnLayoutChangeListener
  • 删除收听者
  • 在更新(getLastVisiblePosition())上执行代码

    mListView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    
      @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        mListView.removeOnLayoutChangeListener(this);
        Log.e(TAG, "updated");
      }
    });
    
    mAdapter.notifyDataSetChanged();