android将json数据传递给listview

时间:2013-07-25 12:45:45

标签: android json listview

我真的不熟悉ListView和列表适配器,所以我在这里需要一点帮助。我需要有人告诉我我的代码有什么问题,以及我可以做些什么来解决这个问题。当我编写这段代码时,我是ListView的新手,所以如果我的代码看起来很疯狂,我会道歉。

Activity代码:

public class MainActivity extends Activity {

    EditText et;
    Button getanswer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Button getanswer = (Button) findViewById(R.id.button1);
        getanswer.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            new asynctask().execute();
            Intent i = new Intent(MainActivity.this, ListView.class);
            startActivity(i);
        }

        });
    } 
}

      class asynctask extends AsyncTask<String, Void, JSONObject> {

             private static final String TAG_RESULTS = "ResultsSet";
             private static final String TAG_SUBJECT = "Subject";
             private static final String TAG_NUMANSWERS = "NumAnswers";
             private static final String TAG_QUESTION = "Question";
             private static final String TAG_QUESTION_CONTENT = "Content";
             private static final String TAG_QUESTION_CHOSENANSWER = "ChosenAnswer";
             private static final String TAG_QUESTION_ANSWERS = "Answers";
            public JSONArray json;

         @Override
         protected JSONObject doInBackground(String... params) {

             JSONParsser jParser = new JSONParsser();

             String URI = "http://answers.yahooapis.com/AnswerService/V1/questionSearch?appid=dF39jyvV34FlZGhhMRBNHhILlsMJWLgBhxp4YrXImT2EOFprfUK3f4w2eGKjC5TC0A&query=sort&type=resolved&results&output=json";

             JSONObject json = jParser.getJSONFromURI(URI);

             return json ;

         }{ }
             @Override
             protected void onPostExecute(JSONObject json) {

                 JSONArray ResultsSet = null; {
                 try {
                     ResultsSet = json.getJSONArray(TAG_RESULTS);
                } catch (JSONException e) {
                   e.printStackTrace();
             }

            return;
        }}}

ListView代码:

public class ListView extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);


        ArrayList<HashMap<String, String>> ResultsSet = new ArrayList<HashMap<String, String>>();

        HashMap<String, String> map = new HashMap<String, String>();

        String TAG_SUBJECT = "Subject";
        String TAG_NUMANSWERS = "NumAnswers";

        ResultsSet.add(map);


        ListAdapter adapter = new SimpleAdapter(this, ResultsSet,
                R.layout.listview,
                 new String[] { TAG_SUBJECT, TAG_NUMANSWERS }, new int[] {
                R.id.Subject, R.id.NumAnswers });


        setListAdapter(adapter);
    }
}

ListView.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/Subject"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="10dip"
        android:textSize="16dip"
        android:textStyle="bold" >

    <TextView
        android:id="@+id/NumAnswers"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="10dip"
        android:textSize="16dip"
        android:textStyle="bold" >

    </TextView>

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </ScrollView>

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</TextView>

这是我的堆栈跟踪它很长

07-25 12:27:45.055: E/AndroidRuntime(1356): FATAL EXCEPTION: main
07-25 12:27:45.055: E/AndroidRuntime(1356): java.lang.ClassCastException: android.widget.TextView cannot be cast to android.view.ViewGroup
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:747)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:121)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.AbsListView.obtainView(AbsListView.java:2159)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.ListView.makeAndAddView(ListView.java:1831)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.ListView.fillDown(ListView.java:674)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.ListView.fillFromTop(ListView.java:735)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.ListView.layoutChildren(ListView.java:1652)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.AbsListView.onLayout(AbsListView.java:1994)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.View.layout(View.java:14008)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.ViewGroup.layout(ViewGroup.java:4373)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.View.layout(View.java:14008)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.ViewGroup.layout(ViewGroup.java:4373)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.View.layout(View.java:14008)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.ViewGroup.layout(ViewGroup.java:4373)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.View.layout(View.java:14008)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.ViewGroup.layout(ViewGroup.java:4373)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.Choreographer.doFrame(Choreographer.java:532)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.os.Handler.handleCallback(Handler.java:725)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.os.Looper.loop(Looper.java:137)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at android.app.ActivityThread.main(ActivityThread.java:5041)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at java.lang.reflect.Method.invokeNative(Native Method)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at java.lang.reflect.Method.invoke(Method.java:511)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-25 12:27:45.055: E/AndroidRuntime(1356):     at dalvik.system.NativeStart.main(Native Method)

很抱歉没有问一个问题的正确方法,对不起日志堆栈跟踪,但我只是想知道为什么我会收到这些错误,如何防止它。

3 个答案:

答案 0 :(得分:0)

这可能不是一个答案,不知道没有问题,但在评论中太难以解释。但我看到一些可能会给你带来问题的事情。

此代码可能会给您带来麻烦

@Override
    public void onClick(View v) {
        new asynctask().execute();
        Intent i = new Intent(MainActivity.this, ListView.class);
        startActivity(i);

如果您希望AsyncTask填满ArrayList,则必须知道无法保证在下一次Activity加载之前完成。您应该在ListView

中开始onPostExecute()活动

ListViewActivity中,您要将map添加到ResultSet,但我根本看不到map的填充位置。

但是,您甚至不需要单独的Activity。您只需在setListAdapter(adapter)的{​​{1}}中致电onPostExecute(),然后在MainActivity延长ListActivity。我希望其中一些可以帮到你。

答案 1 :(得分:0)

请参阅本教程,它解释了如何将数据从JSON显示到Listview

http://mobile.dzone.com/news/android-tutorial-how-parse

您可能缺少的最基本的事情是向ListAdapter添加数据,因此请确保ResultsSet包含一些数据。

请参阅解析JSON数据并更新到ListView部分

http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

答案 2 :(得分:0)

您的异常与JSON解析无关,它与ListView的布局有关。我的猜测是你的布局文件中的某个地方你有这样的东西

<TextView
  <!-- params -->
  >
  <!-- More Stuff -->
</TextView>

这是不可能的,因为TextView里面没有任何其他视图。在R.Layout.listview ViewGroup中设置布局,例如LinearLayout,然后应用codeMagic关于请求和解析的建议。

编辑:我是第二次编辑这个,因为我没有第一次看到那个布局足够接近。根本问题是你有一个TextView,它是你的顶级元素,并包含其中的其他元素。然后,在通货膨胀时,LayoutInflater正试图给你的布局充气(不要担心这是怎么发生的),并且看到“哦,嘿,这个顶层布局里面还有其他孩子,让我把它投到{ {1}}所以我可以添加子项。但是,ViewGroup不是视图组且没有子项,因此TextView会被抛出。

更重要的是,您似乎并不完全了解适配器列表的工作原理。您需要有一个单独的布局,其中包含ClassCastException中任何一个项目的外观信息;那么你的映射需要在THAT布局中引用TextViews。当您附加适配器时,ListView中的每个项目都会膨胀您在ListView调用中指向的较小布局,并将setAdapter设置为较小的布局。然后将这些较小的布局一个放在另一个上面以制作列表。