Android и как изменить вид списка - PullRequest
0 голосов
/ 18 ноября 2011

Я получаю файл 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 голосов
/ 18 ноября 2011

Если вы попытаетесь отладить его, myListView будет нулевым, и, кроме того, вы не сможете изменить элементы пользовательского интерфейса, кроме как в главной ветви.

Это следует сделать с помощью метода 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);

    }
0 голосов
/ 18 ноября 2011

Вы обновляете свой пользовательский интерфейс в doInBackgroung, и это не разрешено, вы должны делать это в onPostExecute. Вы не можете писать эти строки в doInBackground

    myListView = (ListView) findViewById (R.id.lv);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(ReadWebpageAsyncTask.this,
                   R.layout.medialist,
                   mediaList);
0 голосов
/ 18 ноября 2011

в деятельности onCreate() вижу //setContentView(R.layout.main);.Так что нет никакого пользовательского представления контента.

Но AsyncTask пытается получить представление списка с помощью myListView = (ListView) findViewById (R.id.lv);

Я думаю, myListView получает null на данный момент.Вы должны изменить myListView = (ListView) findViewById (R.id.lv) на myListView = getListView();

0 голосов
/ 18 ноября 2011

myListView = (ListView) findViewById (R.id.lv); ArrayAdapter адаптер = новый ArrayAdapter (ReadWebpageAsyncTask.this, R.layout.medialist, mediaList);

Что такое mediaList? Я не думаю, что это универсальный массив, и я думаю, что это должно быть, чтобы это работало.

...