Gson接口解析ListView优化展示

一、主页面 Java代码

		(布局里一个ListView,此处就省略了~~~~)

/*第一个页面
 * 我们用handler+子线程实现请求
 * 并且实现网络判断
 * 以及 没网的时候加载本都数据
 * =============
 * 判断网洛
 * 请求网络
 * 数据库的方法
 *  **第一步 :权限 很多人忘记加权限,所以第一步先把用到的权限加上
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />****
 * */


@Nullable
@Override
   String strURL = "https://www.apiopen.top/novelApi";    //接口地址
   private ListView listView;
public View on**加粗样式**CreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.frag01, container, false);
    
    //第二部:找控件
    listView = view.findViewById(R.id.listview);
    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //第三部:数据( 网络请求数据 使用handler+子线程)
    new Thread() {
        @Override
        public void run() {
            super.run();
            //第四部:判断网络
            boolean isnNet = HttpUtil.isNetworkConnected(getActivity());
            String s = "";
            if (isnNet) {
                //第五步:如果有网络就加载网络数据
                s = HttpUtil.requestString(strURL);
                //得到数据后发送给handler进行解析

            } else {
                //如果没网就就XXXXX
            }
            //第六步  把数据发送给主线程
            Message message = new Message();
            message.what = 0;
            message.obj = s;
            handler.sendMessage(message);
        }
    }.start();
    //适配器
}

Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            case 0:
                //第七步:得到数据并解析
                String s = (String) msg.obj;
                //解析
                Gson gson = new Gson();
                JsonBean jsonBean = gson.fromJson(s, JsonBean.class);
                //我的Jsonbean是用Androidstudio工具封装(Alt+S 复制进去数据,点Ok)
                ArrayList<JsonBean.DataBean> list = jsonBean.getData();
                //第八步:展示数据到listview上
                listView.setAdapter(new MyAdapter(list,getActivity()));
                break;
        }
    }
};

二、工具类

public class HttpUtil {
public static boolean isNetworkConnected(Context context) { //注意工具类中使用静态方法
    //判断上下文是不是空的
    //为啥要判断啊? 防止context是空的导致 报空指针异常
    if (context != null) {
        //获取连接管理器
        ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        //获取网络状态mConnectivityManager.getActiveNetworkInfo();
        NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();

        if (mNetworkInfo != null) {
            //判断网络是否可用//如果可以用就是 true  不可用就是false
            return mNetworkInfo.isAvailable();
        }
    }
    return false;
}

//=====================================================
public static String requestString(String strUrl) {
    try {
        //把String 变成URL
        URL url = new URL(strUrl);
        //打开连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        //连接超时时间
        connection.setConnectTimeout(5000);
        //读取超时时间
        connection.setReadTimeout(5000);
        //设置请求方式(要大写)
        connection.setRequestMethod("GET");
        //判断请求码 HttpURLConnection.HTTP_OK
        if (connection.getResponseCode() == 200) {
            //获取输入流(输入=>读,输出=>写)
            //ctrl+alt+V 补全代码
            InputStream stream = connection.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(stream, "utf-8");//为了防止乱码
            BufferedReader reader = new BufferedReader(inputStreamReader);

            //拼接字符串
            StringBuffer buffer = new StringBuffer();
            String str = "";
            //读取字符串
            while ((str = reader.readLine()) != null) {
                //拼接字符串
                buffer.append(str);
            }
            return buffer.toString();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
   }
}

三、适配器代码

public class MyAdapter extends BaseAdapter {//继承BaseAdapter

private ArrayList<JsonBean.DataBean> list;
private Context context;
public MyAdapter(ArrayList<JsonBean.DataBean> list, Context context) {
    this.list = list;
    this.context = context;
}

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return null;
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = View.inflate(context, R.layout.item, null);
    ImageView imageView = convertView.findViewById(R.id.imageView);
    TextView textView = convertView.findViewById(R.id.textView);

    JsonBean.DataBean dataBean = list.get(position);
    textView.setText(dataBean.getBookname());
    ***//设置图片 需要导Glide包***
    Glide.with(context).load(dataBean.getBook_cover()).into(imageView);
    return convertView;
}

}
=下面是ListView优化时候代码==
ViewHolder holder;
if (convertView==null){
convertView=View.inflate(context,R.layout.item,null);
holder = new ViewHolder();
holder.textView=convertView.findViewById(R.id.textView);
holder.textView2=convertView.findViewById(R.id.textView2);
holder.imageView=convertView.findViewById(R.id.imageView);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(list.get(position).getType());
holder.textView2.setText(list.get(position).getCreatedAt());
Bean.DataBean dataBean = list.get(position);
// holder.imageView.setImageURI(list.get(position).getUrl());
Glide.with(context).load(dataBean.getUrl()).into(holder.imageView);
return convertView;
}
class ViewHolder{
TextView textView,textView2;
ImageView imageView;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值