qq_32381753 2017-05-16 00:58 采纳率: 100%
浏览 1062
已采纳

运行listview有时显示不出数据,有时直接提示app stoped,求大神看看!

做一个显示成绩的页面
package com.example.jy.myapp;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONObject;

public class GradeActivity extends AppCompatActivity {

ListView listView;
//初始化
String [] titles={"学生"} ;
String [] texts={"成绩"} ;
int [] resIds={R.drawable.icon,R.drawable.icon,R.drawable.icon,R.drawable.icon};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_grade);
    final Data app = (Data)getApplication();
    this.setTitle("成绩查询");
    listView=(ListView)this.findViewById(R.id.MyListView);

    new Thread(new Runnable() {
        public void run() {
            WebUtil wu = new WebUtil();
            try {
                //控制台打印收到的信息
                System.out.println("-------------app.getCourseName()----------------"+app.getCourseName());
            String courseName = new String(app.getCourseName().getBytes(), "UTF-8");
            //从网页上获取数据
            String re =  wu.getData("http://192.168.1.107:8080/AndroidServer/listGrade_grade.action?courseName="+courseName+"&username="+app.getUserID()+"&role="+  app.getRole());
            System.out.println("================"+re);
                //new一个json对象,获取数组
                JSONObject jsonObject2 =new JSONObject(re);
                JSONArray jsonArray = jsonObject2.getJSONArray("Rows");

                titles = new String[jsonArray.length()];
                texts = new String[jsonArray.length()];
                for (int i=0;i<jsonArray.length();i++)
                {
                    JSONObject jsonObjectSon= (JSONObject)jsonArray.opt(i);
                    titles[i] = jsonObjectSon.getString("course");
                    if(app.getRole().equals("0")) {
                        texts[i] = "学生姓名:" + jsonObjectSon.getString("student") +  ";分数:" + jsonObjectSon.getString("grade");
                    }else {
                        texts[i] = "分数:" + jsonObjectSon.getString("grade");

                    }
                }

                listView.setAdapter(new ListViewAdapter(titles,texts,resIds));
            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }).start();
    //setContentView(R.layout.activity_grade);
}


public class ListViewAdapter extends BaseAdapter {
    View[] itemViews;

    public ListViewAdapter(String[] itemTitles, String[] itemTexts,
                           int[] itemImageRes) {
        itemViews = new View[itemTitles.length];

        for (int i = 0; i < itemViews.length; ++i) {
            itemViews[i] = makeItemView(itemTitles[i], itemTexts[i],
                    itemImageRes[i]);
        }
    }

    public int getCount() {
        return itemViews.length;
    }

    public View getItem(int position) {
        return itemViews[position];
    }

    public long getItemId(int position) {
        return position;
    }

    private View makeItemView(String strTitle, String strText, int resId) {
        LayoutInflater inflater = (LayoutInflater) GradeActivity.this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // 使用View的对象itemView与R.layout.item关联
        View itemView = inflater.inflate(R.layout.listview_item, null);

        // 通过findViewById()方法实例R.layout.item内各组件
        TextView title = (TextView) itemView.findViewById(R.id.itemTitle);
        title.setText(strTitle);
        TextView text = (TextView) itemView.findViewById(R.id.itemText);
        text.setText(strText);
        ImageView image = (ImageView) itemView.findViewById(R.id.itemImage);
        image.setImageResource(resId);

        return itemView;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null)
            return itemViews[position];
        return convertView;
    }
}
}

log输出如下:
05-15 20:43:48.525 3329-3626/com.example.jy.myapp I/System.out: -------------app.getCourseName()----------------Java课程设计
05-15 20:43:48.576 3329-3626/com.example.jy.myapp I/System.out: ================{"Rows":[{"course":"Java课程设计","grade":"90","student":"张三"},{"course":"Java课程设计","grade":"87","student":"李四"}],"Total":2}
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6855)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:3221)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:759)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:759)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:759)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:759)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:759)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:759)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.View.setFlags(View.java:11364)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.view.View.setFocusableInTouchMode(View.java:8077)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.widget.AdapterView.checkFocus(AdapterView.java:744)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at android.widget.ListView.setAdapter(ListView.java:494)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at com.example.jy.myapp.GradeActivity$1.run(GradeActivity.java:61)
05-15 20:43:48.605 3329-3626/com.example.jy.myapp W/System.err: at java.lang.Thread.run(Thread.java:761)
05-15 20:43:50.200 3329-3329/com.example.jy.myapp I/Choreographer: Skipped 94 frames! The application may be doing too much work on its main thread.

  • 写回答

7条回答 默认 最新

  • 大鼎 2017-05-16 01:24
    关注

    当一个程序第一次启动的时候,Android会同时启动一个对应的主线程,这个主线程就是UI线程,也就是ActivityThread。UI线程主要负责处理与UI相关的事件,如用户的按键点击、用户触摸屏幕以及屏幕绘图等。

    listView.setAdapter(new ListViewAdapter(titles,texts,resIds));不能再子线程里面调用

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大