0

我想使用 AsyncTask 更新 TextView 的文本。

我有列表视图,其中有两个 TextView,一个是 ImageView

当用户按下 ImageView 按钮时,歌曲将从服务器端播放。所以我把代码放在 AsyncTask 任务中

这是一个自定义适配器,我在下面调用 ImageView 的点击事件是我的代码示例,如下所示

     public View getView(final int position, View convertView,
            ViewGroup parent) {

     holder.imgPlay.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {

和 onclick 事件我在 asynctask 中传递 textview,我想在从 Internet 获取数据后进行更改,所以下面是我的代码

     new MetadataTask2().execute(holder.txtMetadata); 

现在 AsyncTask 的代码如下

    class MetadataTask2 extends AsyncTask<TextView, Void, IcyStreamMeta> {
    TextView txtView;

    @Override
    protected IcyStreamMeta doInBackground(
            TextView... arg0) {
                    //SOME OPERATION
        txtView = arg0[0];
        return streamMeta;
    }

    @Override
    protected void onPostExecute(IcyStreamMeta result) {
            txtView.setText("Hiiiiiiii");
        }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        try {
            PD = ProgressDialog.show(CompaniesList.this, "Tuning...",
                    "Please Wait...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

现在在这里你可以看到 textView.setText("Hiii") 文本将被更新,但它不会反映在 Listview 中,因为我必须更新 ListView 或 Adapter 但不知道该怎么做,所以我可以看到文本listview 任何机构都可以帮助我吗

我已经使用下面的代码来更新列表视图,但仍然什么都不做

      adapter.notifyDataSetChanged(); 
      mainListView.setAdapter(adapter); 
      mainListView.invalidate(); 
4

2 回答 2

1

让您的适配器成为您的活动类的成员变量。然后您将能够从 onPostExecute 中引用它。

另外,从您的代码中,我不清楚您的 TextView 是否真的是您打算修改的那个(大概是您膨胀的那个),以防万一,请记住您必须在doInBackground 尝试修改之前在主线程中调用 setContentView任何组件。确保这个 Textview 变量 (arg0[0]??) 是您正在膨胀的变量

于 2013-02-14T07:45:19.587 回答
1

您应该实现自己的ListView适配器,它将向列表视图提供数据。notifyDataSetChanged()从适配器调用PostExecute()将强制列表视图从适配器获取数据。直接更新列表视图视图看起来很奇怪。

于 2013-02-14T07:57:24.773 回答