解析JSON数据,加载到ListView一片空白

qq_34093235 2016-04-19 06:02:21
我通过解析MOOC网的API希望把数据显示到ListView上,但ListView一片空白,我单独调试过适配器部分和获取数据部分都是好的,就是一结合在一起就不行了。。
MainActivity的代码:
package com.example.dell.imooctest;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
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.SimpleAdapter;
import android.widget.TextView;

import com.example.dell.imooctest.Http.HttpCallbackListener;
import com.example.dell.imooctest.Http.HttpUtil;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.Inflater;

public class MainActivity extends Activity {
private ListView listView;
private List<Kec> list = new ArrayList<Kec>();
private LayoutInflater minflater ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.mlist);
minflater = getLayoutInflater();
HttpUtil.sendHttpRequest("http://www.imooc.com/api/teacher?type=4&num=30", new HttpCallbackListener() {
@Override
public void onFinish(String response) {
try {
//Log.d("aaa",response);
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObjectg = jsonArray.getJSONObject(i);
Kec kec = new Kec();
kec.image = jsonObjectg.getString("picSmall");
kec.title = jsonObjectg.getString("name");
kec.content = jsonObjectg.getString("description");
list.add(kec);
}

} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public void onError(Exception e) {
e.printStackTrace();
}
});

final BaseAdapter baseAdapter = new BaseAdapter() {
@Override
public int getCount() {
return list.size();
}

@Override
public Kec getItem(int position) {
return list.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(convertView == null) {
view = minflater.inflate(R.layout.zilayout, null);}
TextView title = (TextView) view.findViewById(R.id.title_n);
TextView content = (TextView) view.findViewById(R.id.neirong);
ImageView imageView = (ImageView) view.findViewById(R.id.tututu);
Kec kec1 = getItem(position);
title.setText(kec1.title);
Log.d("aaa",kec1.title);
content.setText(kec1.content);

return view;
}
};

listView.setAdapter(baseAdapter);
}
}


HttpUtil的代码:
package com.example.dell.imooctest.Http;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

/**
* Created by dell on 2016/4/18.
*/
public class HttpUtil {
public static void sendHttpRequest(final String address, final HttpCallbackListener listener){
new Thread(new Runnable() {
HttpURLConnection conn = null;
@Override
public void run() {
try {
URL url = new URL(address);
conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(8000);
conn.setReadTimeout(8000);
InputStream in = conn.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(in,"utf-8"));
StringBuilder response = new StringBuilder();
String line = null;
while ((line = bf.readLine()) != null){
response.append(line);
}
if (listener != null){
listener.onFinish(response.toString());
}
} catch (Exception e) {
listener.onError(e);
}finally {
if(conn != null){
conn.disconnect();
}
}
}
}).start();
}
}


HttpCallbackListener接口就声明了两个方法:一个onFinish,一个onError

Kec类代码:
package com.example.dell.imooctest;

import android.media.Image;

/**
* Created by dell on 2016/4/18.
*/
public class Kec {

public String image;
public String title;
public String content;

}
...全文
240 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
青羽四无 2016-11-02
  • 打赏
  • 举报
回复
楼主的代码,改成什么样了?能看看么?非常感谢。
周周爸 2016-04-21
  • 打赏
  • 举报
回复
这种错误可以先在接收URL传递的返回值的时候定义个string log打印出来 解析完的list也要打印。一步一步去找问题所在。 代码格式太混乱。 最好封装一下。 加载的话AsyncTask里doinbackground里去执行你封装的访问方法。
秃头地中海 2016-04-20
  • 打赏
  • 举报
回复
这样写不行的 QAQ
xingzhong128 2016-04-19
  • 打赏
  • 举报
回复
你的onFinish是在子线程里调用的,这是不行的,建议你改用AsyncTask来进行异步加载
设计失 2016-04-19
  • 打赏
  • 举报
回复
网络请求完成之后可以用Handler来对数据设置
设计失 2016-04-19
  • 打赏
  • 举报
回复
请求网络还在用HttpConnection
qq_34093235 2016-04-19
  • 打赏
  • 举报
回复
引用 4 楼 u014027694 的回复:
[quote=引用 2 楼 qq_34093235 的回复:] [quote=引用 1 楼 u014027694 的回复:] 大哥异步操作不是你这么做的,你请求还没结束,listView就已经设置了适配器,并且数据源里没有数据,你要么把给listview设置适配器的操作放到onFinish回调里去,要么早onFinish里去设置适配器的数据源并且通知适配器更新
您好,我之前试过把setAdapter放到onFinish里面,但是ListView还是一篇空白怎么破 。。。QAQ[/quote] 不是在onFinish里setAdapter就可以的,你得把adapter的实例化和setAdapter放到onFinish里的循环后面[/quote] 很感谢您,刚刚换了个模拟器就好了,按你的方法可以实现。
qq_34093235 2016-04-19
  • 打赏
  • 举报
回复
引用 4 楼 u014027694 的回复:
[quote=引用 2 楼 qq_34093235 的回复:] [quote=引用 1 楼 u014027694 的回复:] 大哥异步操作不是你这么做的,你请求还没结束,listView就已经设置了适配器,并且数据源里没有数据,你要么把给listview设置适配器的操作放到onFinish回调里去,要么早onFinish里去设置适配器的数据源并且通知适配器更新
您好,我之前试过把setAdapter放到onFinish里面,但是ListView还是一篇空白怎么破 。。。QAQ[/quote] 不是在onFinish里setAdapter就可以的,你得把adapter的实例化和setAdapter放到onFinish里的循环后面[/quote] 那个。。我刚刚试了一下还是一片空白。。
节操在此 2016-04-19
  • 打赏
  • 举报
回复
引用 2 楼 qq_34093235 的回复:
[quote=引用 1 楼 u014027694 的回复:] 大哥异步操作不是你这么做的,你请求还没结束,listView就已经设置了适配器,并且数据源里没有数据,你要么把给listview设置适配器的操作放到onFinish回调里去,要么早onFinish里去设置适配器的数据源并且通知适配器更新
您好,我之前试过把setAdapter放到onFinish里面,但是ListView还是一篇空白怎么破 。。。QAQ[/quote] 不是在onFinish里setAdapter就可以的,你得把adapter的实例化和setAdapter放到onFinish里的循环后面
qq_34093235 2016-04-19
  • 打赏
  • 举报
回复
我将setAdapter放到了onFinish里面,并且将new BaseAdapter放到了前面,还是不行。。我在getView里面打了个LOG发现getView方法根本就没有被执行。
qq_34093235 2016-04-19
  • 打赏
  • 举报
回复
引用 1 楼 u014027694 的回复:
大哥异步操作不是你这么做的,你请求还没结束,listView就已经设置了适配器,并且数据源里没有数据,你要么把给listview设置适配器的操作放到onFinish回调里去,要么早onFinish里去设置适配器的数据源并且通知适配器更新
您好,我之前试过把setAdapter放到onFinish里面,但是ListView还是一篇空白怎么破 。。。QAQ
节操在此 2016-04-19
  • 打赏
  • 举报
回复
大哥异步操作不是你这么做的,你请求还没结束,listView就已经设置了适配器,并且数据源里没有数据,你要么把给listview设置适配器的操作放到onFinish回调里去,要么早onFinish里去设置适配器的数据源并且通知适配器更新

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧