从ListView android行更新TextView

时间:2014-12-22 21:58:09

标签: android android-listview

我正在从Custom ArrayAdapter调用的Async类中检索一些数据。当我添加新评论时,我更新评论文本视图并且工作正常,但在我重新加载整个列表后,更新不再出现。我可以在logcat中看到有一个新的注释nr,但不在UI上。

不应该这样:answersListView.invalidateViews够了吗?我试图从列表视图更新该行,以避免一段时间后没有更新注释的问题。

private void updateView(int index) {
        System.out.println("index: " + index);
        View v = answersListView.getChildAt(index - answersListView.getFirstVisiblePosition());

        if (v == null)
            return;

        final TextView nrComments = (TextView) v.findViewById(com.dub.mobile.R.id.showCommentsTxt);
        if (nrComments != null) {
            if (nrComments.getText().toString().trim().length() == 0) {
                // first comment
                nrComments.setText("1 comments");
            } else {
                // comments exist already
                int newNr = Integer.parseInt(nrComments.getText().toString().trim()
                        .substring(0, nrComments.getText().toString().trim().indexOf("comments")).trim()) + 1;
                nrComments.setText(newNr + " comments");
            }
            System.out.println("final nr of comments: " + nrComments.getText());
            nrComments.setVisibility(View.VISIBLE);
        }

        answersListView.getAdapter().getView(position, v, answersListView);
        v.setBackgroundColor(Color.GREEN);

        answersListView.invalidateViews();
    }

并且:

updateView(position);
adapter.notifyDataSetChanged();

3 个答案:

答案 0 :(得分:1)

您需要更新UI线程中的数据。 如果您的Async类中有上下文,请使用

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //update here
            }
        });

android.os.Handler handler = new android.os.Handler();
        handler.post(new Runnable() {
            @Override
            public void run() {
                //update here
            }
        });

答案 1 :(得分:1)

答案几乎是@Rami在对你的问题的评论中所说的。您不需要直接更新视图,只需更新数据即可。在您的适配器中,您覆盖了getView方法,在您进行所有这些更改的地方,您不需要updateViews方法。 让我试着解释它是如何工作的。

  1. listView使用适配器。
  2. 列表视图询问适配器"给我X位置的视图"使用getView方法。
  3. 适配器创建该视图,返回到ListView,以及显示的内容。
  4. 适配器本身应包含一个包含您要显示的数据的列表。
  5. 每当其中一个视图在屏幕中变得可见或不可见时,或者如果调用notifyDataSetChanged方法,就会创建和销毁这些视图(行)。

    所以现在,问题是,如果你改变,让我们说,适配器列表的位置5中的对象,用于具有新数据的不同对象,然后下一次ListView请求适配器给出在位置5的视图中,适配器将使用新数据创建视图(行)。就是这样。

答案 2 :(得分:0)

这不是您在列表视图中更改项目数据的方式。您必须使用某些字符串数组来填充适配器的getView函数中textview中的数据。您只需要更改该数组,然后在适配器上调用notifydatasetchanged。视图由适配器回收,因此上面没有意义

getView(...) { TextView tv = new TextView(context); tv.setText(myData的[指数]); //您需要更改myData数组内容 }