如何动态更新TextView文本

4

在BroadcastReceiver中,我会跟踪每次下载列表的时间,并且每次下载后,我都想用最后一次更新一个textview。我已经尝试过以下操作,但是时间从未被显示。

@Override
public void onReceive(Context context, Intent intent) {
_context = context;
Toast.makeText(context, "ListDownloadReceiver....", Toast.LENGTH_SHORT)
    .show();

boolean force = intent.getBooleanExtra("FORCE", false);

long nextUpdateTime = getUpdateTime();

if (force || nextUpdateTime < System.currentTimeMillis()) {
    if (isNetworkAvailable()) {
    Log.i(LIST_DOWNLOAD_RECEIVER,
        "Going to be downloading the list...");
    DownloadListData downloadList = new DownloadListData(context);
    downloadList.execute();

    } else {
    Log.i(LIST_DOWNLOAD_RECEIVER, "Not connected...");
    context.registerReceiver(this, new IntentFilter(
        ConnectivityManager.CONNECTIVITY_ACTION));
    }
}

DatabaseHandler db = DatabaseHandler.getInstance(context);
String timeFormat = "d/M/yyyy 'at' k:mm:ss";

long lastUpdate = Long.valueOf(db.getPreference("LAST_UPDATED_TIME",
    "0"));

CharSequence time = DateFormat.format(timeFormat, lastUpdate);
Log.i(LIST_DOWNLOAD_RECEIVER, "Time is: " + time);

LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.activity_main, null);
TextView tv = (TextView) view.findViewById(R.id.lastRefreshed);
tv.append("Blah: " + time);

}

这是我的 .xml 文件。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="left|top"
    android:orientation="vertical" >

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/noShowsLayout"
        android:layout_width="match_parent"
        android:layout_height="115dp"
        android:orientation="horizontal"
        android:background="@color/blue" >

        <TextView
            android:id="@+id/noShowsTextView"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:gravity="center"
            android:text="@string/no_added_shows"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textSize="18dip" />
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <ListView
            android:id="@+id/listView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
        </ListView>
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="48dp"
        android:layout_gravity="bottom"
        android:background="@color/blue"
        android:orientation="horizontal" >

        <ImageButton 
            android:id="@+id/refreshButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:contentDescription="@string/refresh"
            android:src="@drawable/refresh"/>

        <TextView
            android:id="@+id/lastRefreshed"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center"
            android:layout_marginLeft="5dp"
            android:text="@string/lastRefreshTime" 
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <ImageButton
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:contentDescription="@string/remove_tv_show"
            android:src="@drawable/content_discard" 
            android:clickable="false"/>


    </LinearLayout>

</LinearLayout>
5个回答

14
您已经编写了以下代码来在TextView中显示文本:
TextView tv = (TextView) view.findViewById(R.id.lastRefreshed);
tv.append("Blah: " + time);

我建议您使用.setText()方法而不是.append()方法,如下所示,

TextView tv = (TextView) view.findViewById(R.id.lastRefreshed);
tv.setText("Blah: " + time);
view.invalidate();  // for refreshment

在这行代码中,View view = inflater.inflate(R.layout.activity_main, null); 中的 activity_main 是什么? - Lucifer
我相信这是指我发布的XML布局。 - da3m0n
我也是这么想的,所以我检查了你的XML文件,没有ID为“activity_main”的,请再次检查,可能是引用了其他的XML文件。 - Lucifer
是的,我也考虑过这个问题,所以我从textview中删除了android:text="@string/lastRefreshTime",以确保它被调用并正确更新。我只留下了一个空白区域,而不是“上次更新时间:...”,所以肯定是调用了正确的xml文件。 - da3m0n
3
setText 调用 invalidate,因此在 setText 后您无需调用 invalidate。 - Mathijs Segers

3

尝试以下方法(对我有效):

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        tv.setText("Blah: " + time);
    }
});

1
在安卓中,UI元素的工作方式是,如果你想访问元素,必须在UI线程中进行,我们从API或互联网相关的非UI线程中获取数据,所以在获取非UI线程的结果后,我们可以轻松地更新UI线程的元素。你可能已经在logcat中看到了太多的UI线程工作量,这与那些东西有关,不要深入研究。如果你想在解析数据完成后通过编程方式更新它,请调用UI线程并更新元素。

0

创建一个新的线程,在run()方法内编写更新所需字段的代码,然后启动循环。一定要记住,您必须在UI线程上执行更新操作。


0

添加了OnClickListener并实现了onClick,使用View参数并转换为TextView

@Override
public void onClick(View v) {
    TextView textView = (TextView) v;
    textView.setText(crotLoan.getReducedNumber());
}

使用onClick的想法来自于如何在setText更改文本后更新屏幕?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接