Viewpager+XListView+Internet

Android应用网络加载实践
本文介绍了一个基于Android的应用中如何实现网络数据加载、图片展示及列表分页加载等功能。通过自定义Adapter实现了不同类型的列表项布局,并利用了异步任务进行后台数据请求,同时展示了如何处理网络状态并提示用户。
package com.example.android_mobileinternet_test1;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.example.android_mobileinternet_test1.bean.MenuInFo;
import com.example.android_mobileinternet_test1.utils.ImageLoaderAsyncTask;
import com.example.android_mobileinternet_test1.utils.NetWorkUtils;
import com.example.android_mobileinternet_test1.utils.StreamTools;
import com.google.gson.Gson;
import com.limxing.xlistview.view.XListView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by 范晋炜 on 2017/7/26 0026.
 * com.example.android_mobileinternet_test1
 * SecondActivity
 */


public class SecondActivity extends AppCompatActivity implements XListView.IXListViewListener {

    private ViewPager viewPager;
    private List<String> imageAddress = new ArrayList<>();
    private int index = 0;
    private int indexs = 1;
    private boolean flag;
    private static final int TYPE_0 = 0;
    private static final int TYPE_1 = 1;
    private MyBaseAdapter adapter;
    private ProgressDialog dialog;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 1:
                {
                    viewPager.setCurrentItem(index);
                }
                break;
            }
        }
    };
    private XListView xLV;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        viewPager = (ViewPager) findViewById(R.id.sec_pager);
        xLV = (XListView) findViewById(R.id.sec_XList);

        imageAddress.add("http://www.taoqao.com/uploads/allimg/140425/1-140425212357.jpg");
        imageAddress.add("http://www.taoqao.com/uploads/allimg/140425/1-140425212400.jpg");
        imageAddress.add("http://www.taoqao.com/uploads/allimg/140425/1-140425212403.jpg");
        imageAddress.add("http://www.taoqao.com/uploads/allimg/140425/1-140425212522.jpg");
        imageAddress.add("http://www.taoqao.com/uploads/allimg/140425/1-140425212525.jpg");

        viewPager.setAdapter(new MyPagerAdapter());
        autoPlay();
        xLV.setPullLoadEnable(true);
        xLV.setXListViewListener(this);

        //判断网络设置  如果有网络加载数据  如果未连接网络弹出对话框
        if(NetWorkUtils.isConnection(this)){
            getData("http://apis.juhe.cn/cook/query.php",indexs+"",10+"");
        }else{
            showNetWorkSettingDialog();
        }

    }

    @Override
    public void onRefresh() {
        ++indexs;
        getData("http://apis.juhe.cn/cook/query.php",indexs+"",10+"");
        flag = true;
        xLV.stopRefresh(true);
    }

    @Override
    public void onLoadMore() {
        ++indexs;
        getData("http://apis.juhe.cn/cook/query.php",indexs+"",10+"");
        flag = false;
        xLV.stopLoadMore();
    }


    private void getData(final String path, String pn, String rn){
        new AsyncTask<String, Void, String>() {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                getDialog();
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                if(s == null)
                    return;

                Gson gson = new Gson();
                MenuInFo menuInFo = gson.fromJson(s, MenuInFo.class);
                List<MenuInFo.ResultBean.DataBean.StepsBean> results = menuInFo.getResult().getData().get(0).getSteps();

                //适配数据
                if(adapter == null){
                    adapter = new MyBaseAdapter(results);
                    xLV.setAdapter(adapter);
                }else{
                    adapter.loadMore(results,flag);
                    adapter.notifyDataSetChanged();
                }
                dialog.dismiss();
            }

            @Override
            protected String doInBackground(String... params) {
                try {
                    String path = params[0];
                    String pn = params[1];
                    String rn = params[2];

                    URL url = new URL(path);

                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("POST");
                    connection.setConnectTimeout(5000);
                    connection.setReadTimeout(5000);

                    OutputStream os = connection.getOutputStream();
                    os.write(("key=a71e47bbe5a7e7a2ecf068ca9a756032&menu=" +
                            URLEncoder.encode("地三鲜","utf-8") + "&pn=" + pn + "&rn=" + rn).getBytes());
                    os.flush();

                    int code = connection.getResponseCode();
                    if(code == HttpURLConnection.HTTP_OK){
                        InputStream is = connection.getInputStream();
                        String json = StreamTools.readFromNetWork(is);
                        return json;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

                return null;
            }
        }.execute(path,pn,rn);
    }

    class MyBaseAdapter extends BaseAdapter{

        private List<MenuInFo.ResultBean.DataBean.StepsBean> results;

        public MyBaseAdapter(List<MenuInFo.ResultBean.DataBean.StepsBean> results) {
            this.results = results;
        }

        public void loadMore(List<MenuInFo.ResultBean.DataBean.StepsBean> data,boolean flag){
            for (MenuInFo.ResultBean.DataBean.StepsBean bean:data) {
                if(flag){
                    results.add(0,bean);
                }else{
                    results.add(bean);
                }
            }
        }

        @Override
        public int getCount() {
            return results != null ? results.size() : 0;
        }

        @Override
        public Object getItem(int position) {
            return results.get(position);
        }

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

        @Override
        public int getItemViewType(int position) {
            if(position % 2 == 0){
                return TYPE_0;
            }else{
                return TYPE_1;
            }
        }

        @Override
        public int getViewTypeCount() {
            return 2;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            int type = getItemViewType(position);

            ViewHolder holder = null;
            ViewHolder2 holder2 = null;

            switch (type){
                case 0:
                {
                    if(convertView == null){
                        convertView = convertView.inflate(SecondActivity.this, R.layout.item1,null);
                        holder = new ViewHolder();
                        holder.item1_img1 = (ImageView) convertView.findViewById(R.id.item1_img1);
                        holder.item1_img2 = (ImageView) convertView.findViewById(R.id.item1_img2);
                        holder.item1_img3 = (ImageView) convertView.findViewById(R.id.item1_img3);
                        convertView.setTag(holder);
                    }else{
                        holder = (ViewHolder) convertView.getTag();
                    }
                }
                break;

                case 1:
                {
                    if(convertView == null){
                       convertView = convertView.inflate(SecondActivity.this,R.layout.item2,null);
                       holder2 = new ViewHolder2();
                       holder2.item2_img = (ImageView) convertView.findViewById(R.id.item2_img);
                        convertView.setTag(holder2);
                    }else{
                        holder2 = (ViewHolder2) convertView.getTag();
                    }
                }
                break;
            }

            switch (type){
                case 0:
                {
                    getImage(results.get(position).getImg(),holder.item1_img1);
                    getImage(results.get(position).getImg(),holder.item1_img2);
                    getImage(results.get(position).getImg(),holder.item1_img3);
                }
                break;

                case 1:
                {
                    getImage(results.get(position).getImg(),holder2.item2_img);
                }
                break;
            }

            return convertView;
        }

        class ViewHolder{
            ImageView item1_img1,item1_img2,item1_img3;
        }

        class ViewHolder2{
            ImageView item2_img;
        }
    }

    private void getImage(String path,ImageView imageView){
        //自定义配置
                DisplayImageOptions options = new DisplayImageOptions.Builder()
                        .cacheInMemory(true)//让图片进行内存缓存
                        .cacheOnDisk(true)//让图片进行sdcard缓存
                        .showImageForEmptyUri(R.mipmap.a)//图片地址有误
                        .showImageOnFail(R.mipmap.b)//当图片加载出现错误的时候显示的图片
                        .showImageOnLoading(R.mipmap.c)//图片正在加载的时候显示的图片
                        .build();

                //ImageLoader.getInstance().loadImage(path,options,new Ima);//加载图片
                //参数1:加载的图片地址
                //参数2:将图片设置到那个图片控件上面
                //参数3:加载图片配置选项,意思是指明对这张图片的是否进行缓存(内存、sdcard)
                ImageLoader.getInstance().displayImage(path, imageView, options);
    }

    class MyPagerAdapter extends PagerAdapter{

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            final ImageView imageView = new ImageView(SecondActivity.this);

            new ImageLoaderAsyncTask(new ImageLoaderAsyncTask.ImageClallBackListener() {
                @Override
                public void imageCallBack(Bitmap bitmap) {
                    if(bitmap != null){
                        imageView.setImageBitmap(bitmap);
                    }else{
                        imageView.setImageResource(R.mipmap.ic_launcher_round);
                    }
                }
            }).execute(imageAddress.get(position % imageAddress.size()));
            container.addView(imageView);
            return imageView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }

    private void autoPlay(){
        new Thread(){
            @Override
            public void run() {
                super.run();
                while (true){
                    index++;
                    int index1 = index % imageAddress.size();
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.sendEmptyMessage(1);
                }
            }
        }.start();
    }

    //获取dialog的方法
    private void getDialog(){
        dialog = new ProgressDialog(this);
        dialog.setMessage("正在玩儿命加载数据");
        dialog.show();
    }

    private void showNetWorkSettingDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(SecondActivity.this);
        builder.setMessage("没有设置网络,请您设置网络!");
        builder.setNegativeButton("取消",null);
        builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent();
                intent.setAction("android.settings.WIRELESS_SETTINGS");
                startActivity(intent);
            }
        });
        builder.create().show();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值