完成AsyncTask后的ListView更新

时间:2013-02-14 07:35:37

标签: android android-asynctask android-view

我想使用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(); 

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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