Android以及如何更改listview

时间:2011-11-18 18:01:59

标签: android listview android-arrayadapter

我从服务器解析到列表中得到一个json文件,我正在尝试更新列表视图,我看到当我尝试这行代码时

ArrayAdapter<String> adapter = new ArrayAdapter<String>(ReadWebpageAsyncTask.this,R.layout.medialist, mediaList);

它工作得很好但是当我尝试这行“myListView.setAdapter(adapter);”一切都出错了,你们能看到我做错了什么,任何帮助都会受到高度赞赏。

package de.vogella.android.asynctask;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;

import android.app.Activity;
import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ReadWebpageAsyncTask extends ListActivity  {
    private TextView textView;
    public ListView myListView = null;
    List<String> mediaList = new ArrayList();
    ArrayAdapter<String> adapter;
    String[] newArray;
/** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                "Linux", "OS/2" };
        //String[] myMediList = mediaList.toArray(mediaList);
        newArray = new String[mediaList.size()];mediaList.toArray(newArray);
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, newArray);
        setListAdapter(adapter);
        readWebpage(myListView);



    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        String item = (String) getListAdapter().getItem(position);
        Toast.makeText(this, item + " selected", Toast.LENGTH_LONG);
    }



    private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {
            String response = "";
            String responseBuilder;
            String responseString = "";
            JSONArray jsonArray;
            JSONObject jObject = new JSONObject();

            for (String url : urls) {
                DefaultHttpClient client = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet(url);
                try {
                    HttpResponse execute = client.execute(httpGet);
                    InputStream content = execute.getEntity().getContent();

                    BufferedReader buffer = new BufferedReader(
                            new InputStreamReader(content));
                    String s = "";
                    while ((s = buffer.readLine()) != null) {
                        response += s;
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            try {
                //JSONObject json = new JSONObject(response);
                //JSONObject jObject = new JSONObject(response);

                //jObject = response.t
                jsonArray = new org.json.JSONArray(response);
                jObject = jsonArray.toJSONObject(jsonArray);

                for (int i=0;i<jObject.length();i++)
                {
                    responseBuilder="\n";
                    responseBuilder+= "\n title: "+((JSONObject) jsonArray.getJSONObject(i).get("videoinfo")).get("title");
                    responseBuilder+= "\n subject: "+ ((JSONObject) jsonArray.getJSONObject(i).get("videoinfo")).get("subject");
                    responseBuilder+= "\n language: "+ ((JSONObject) jsonArray.getJSONObject(i).get("videoinfo")).get("language");
                    responseBuilder+= "\n date: "+ ((JSONObject) jsonArray.getJSONObject(i).get("videoinfo")).get("date");


                    mediaList.add(responseBuilder); 
                    responseString += responseBuilder;
                }



            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            myListView = (ListView) findViewById (R.id.lv);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(ReadWebpageAsyncTask.this,
                       R.layout.medialist,
                       mediaList);

            myListView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            return responseString;

            //final ArrayAdapter <String> aa;
            //aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mediaList);
            // Bind the array adapter to the listview
            //myListView.setAdapter(aa);
        }

        @Override
        protected void onPostExecute(String result) {
            textView.setText(result);
            adapter.notifyDataSetChanged();

            //textView.setText(myListView.toString());
            //final ArrayAdapter <String> aa;
            //aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mediaList);
            //Bind the array adapter to the listview
            //myListView.setAdapter(aa);

        }
    }


    public void readWebpage(View view) {
        DownloadWebPageTask task = new DownloadWebPageTask();
        task.execute(new String[] { "http://hummedia.byu.edu/mediainfo/search/?title=Harry" });

    }


}

这是我的堆栈跟踪:

11-18 10:54:55.946: W/dalvikvm(790): threadid=11: thread exiting with uncaught exception (group=0x409951f8)
11-18 10:54:56.323: E/AndroidRuntime(790): FATAL EXCEPTION: AsyncTask #1
11-18 10:54:56.323: E/AndroidRuntime(790): java.lang.RuntimeException: An error occured while executing doInBackground()
11-18 10:54:56.323: E/AndroidRuntime(790):  at android.os.AsyncTask$3.done(AsyncTask.java:278)
11-18 10:54:56.323: E/AndroidRuntime(790):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-18 10:54:56.323: E/AndroidRuntime(790):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-18 10:54:56.323: E/AndroidRuntime(790):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-18 10:54:56.323: E/AndroidRuntime(790):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-18 10:54:56.323: E/AndroidRuntime(790):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
11-18 10:54:56.323: E/AndroidRuntime(790):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-18 10:54:56.323: E/AndroidRuntime(790):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-18 10:54:56.323: E/AndroidRuntime(790):  at java.lang.Thread.run(Thread.java:856)
11-18 10:54:56.323: E/AndroidRuntime(790): Caused by: java.lang.NullPointerException
11-18 10:54:56.323: E/AndroidRuntime(790):  at de.vogella.android.asynctask.ReadWebpageAsyncTask$DownloadWebPageTask.doInBackground(ReadWebpageAsyncTask.java:122)
11-18 10:54:56.323: E/AndroidRuntime(790):  at de.vogella.android.asynctask.ReadWebpageAsyncTask$DownloadWebPageTask.doInBackground(ReadWebpageAsyncTask.java:1)
11-18 10:54:56.323: E/AndroidRuntime(790):  at android.os.AsyncTask$2.call(AsyncTask.java:264)
11-18 10:54:56.323: E/AndroidRuntime(790):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-18 10:54:56.323: E/AndroidRuntime(790):  ... 5 more

4 个答案:

答案 0 :(得分:0)

  

myListView =(ListView)findViewById(R.id.lv);               ArrayAdapter adapter = new ArrayAdapter(ReadWebpageAsyncTask.this,                          R.layout.medialist,                          medialist中);

什么是mediaList?我不认为它是一个通用数组,我认为它需要这个才能工作。

答案 1 :(得分:0)

您正在doInBackgroung中更新您的ui,这是不允许您在onPostExecute中执行此操作。您不能在doInBackground中写这些行

    myListView = (ListView) findViewById (R.id.lv);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(ReadWebpageAsyncTask.this,
                   R.layout.medialist,
                   mediaList);

答案 2 :(得分:0)

在活动onCreate()中,我看到//setContentView(R.layout.main);。所以没有自定义内容视图。

但AsyncTask尝试按myListView = (ListView) findViewById (R.id.lv);

获取列表视图

我认为myListView此时获得null。您应该将myListView = (ListView) findViewById (R.id.lv)更改为myListView = getListView();

答案 3 :(得分:0)

如果您尝试调试它, myListView为null,此外,除了主要的trhead之外,您无法更改UI元素。

您应该在onPostExecute方法中执行此操作:

@覆盖

    protected void onPostExecute(String result) {

       // textView.setText(result);
        //adapter.notifyDataSetChanged();
         ArrayAdapter<String> adapter = new ArrayAdapter<String>(ReadWebpageAsyncTask.this,
                   android.R.layout.simple_list_item_1,
                   mediaList);
        setListAdapter(adapter);

        //textView.setText(myListView.toString());
        //final ArrayAdapter <String> aa;
        //aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mediaList);
        //Bind the array adapter to the listview
        //myListView.setAdapter(aa);

    }