我想使用AsyncTask更新TextView的文本。
我有列表视图,其中有两个TextView,一个是ImageView
当用户按下ImageView按钮时,将从服务器端播放乐曲。所以我把代码放在AsyncTask任务中
这是一个自定义适配器,我在下面调用ImageView的Click事件就是我这样的代码示例
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,我想在从互联网获取数据后进行更改,所以下面是我的代码
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上的文字可以任何身体帮助我
我使用下面的代码更新listview但仍然无效
adapter.notifyDataSetChanged();
mainListView.setAdapter(adapter);
mainListView.invalidate();
答案 0 :(得分:1)
让适配器成为活动类的成员变量。然后,您将能够从onPostExecute引用它。
另外,从你的代码中我不清楚你的TextView是否实际上是你想要修改的那个(大概是你膨胀的那个)以防万一,记住你必须在主线程中调用setContentView 之前 doInBackground尝试修改任何组件。确保此Textview变量(arg0 [0] ??)是您正在膨胀的变量
答案 1 :(得分:1)
您应该实现自己的ListView
适配器,它将向列表视图提供数据。从适配器调用notifyDataSetChanged()
中的PostExecute()
将强制列表视图从适配器获取数据。直接更新列表视图视图看起来很奇怪。