动漫-无限轮播小圆点+判断网络+网络请求+多条目加载XListView+ImageLoader

本文介绍了一个综合应用无限轮播图、XListView加载更多数据、使用ImageLoader进行图片缓存的示例。文章详细展示了如何通过自定义Adapter实现无限轮播图效果,同时介绍了XListView的上拉加载更多和下拉刷新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

模块一:无限轮播+请求网络数据+多条目加载

1、 用HttpUrlConnection请求网络数据

   a.初始化成功

   b.数据请求成功

   c.数据解析成功

2、 轮播图+小圆点实现

   a.轮播图每3秒切换一张

   b.实现小圆点跟随一起切换

3、 底部四个RadioButton+Fragment实现页面点击切换、可滑动解决滑动事件与轮播图事件冲突)

4、 XListView实现多条目加载

5、 图片加载使用ImageLoader配置缓存路径、缓存大小、超时时间、缓存策略,默认图片、错误时显示图片、圆角显示)…自定义配置

6、 实现下拉刷新,上拉加载

7、 XListView进行优化,防止出现内存泄漏


实现代码:

一.MainActivity.java

package exam.Month;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.RadioGroup;
import java.util.ArrayList;
import java.util.List;
import fragment.Find_Fragment;
import fragment.Mine_Fragment;
import fragment.ShouYe_Fragment;
import fragment.V_Fragment;


public class MainActivity extends AppCompatActivity {
    private ViewPager main_viewPager;
    private List<Fragment> list;
    private RadioGroup group;


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


        group = (RadioGroup) findViewById(R.id.groups);
        main_viewPager = (ViewPager) findViewById(R.id.main_viewPager);


        //定义集合添加数据
        list = new ArrayList<>();
        list.add(new ShouYe_Fragment());
        list.add(new Find_Fragment());
        list.add(new V_Fragment());
        list.add(new Mine_Fragment());


        //在ViewPager中加入此行代码可使当页数据一直有效显示,不会随着页面滑动而消失
        main_viewPager.setOffscreenPageLimit(list.size());


        //设置适配器
        main_viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return list.get(position);
            }


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


        //ViewPager的滑动改变事件,底部四个RadioButton+Fragment实现页面点击切换(5分)、可滑动
        main_viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int position) {
                group.check(group.getChildAt(position).getId());
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });


        //RadioButton的选中改变事件
        group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                switch (i){
                    case R.id.button_01:
                        main_viewPager.setCurrentItem(0,false);
                        break;
                    case R.id.button_02:
                        main_viewPager.setCurrentItem(1,false);
                        break;
                    case R.id.button_03:
                        main_viewPager.setCurrentItem(2,false);
                        break;
                    case R.id.button_04:
                        main_viewPager.setCurrentItem(3,false);
                        break;
                    default:
                        break;
                }
            }
        });
    }
}

二.自定义适配器类

1. MyPagerAdapter.java(适用于无限轮播图)

package adapter;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.List;
import bean.Bean;

//无限轮播图的适配器
public class MyPagerAdapter extends PagerAdapter{
    private Context context;
    private List<Bean.DataBean.ComicsBean> list;

    public MyPagerAdapter(Context context, List<Bean.DataBean.ComicsBean> list) {
        this.context = context;
        this.list = list;
    }

    @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) {
        //设置视图
        ImageView view = new ImageView(context);
        view.setScaleType(ImageView.ScaleType.FIT_XY);
        ImageLoader.getInstance().displayImage(list.get(position%list.size()).getCover_image_url(),view);
        container.addView(view);
        return view;
    }

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

2. MyBaseAdapter.java(适用于XListView视图)

package adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.List;
import bean.Bean;
import exam.Month.R;
import util.ImageLoaderUtil;

public class MyBaseAdapter extends BaseAdapter{
    private Context context;
    private List<Bean.DataBean.ComicsBean> list;

    public MyBaseAdapter(Context context, List<Bean.DataBean.ComicsBean> list) {
        this.context = context;
        this.list = list;
    }

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

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

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

    //XListView进行优化,防止出现内存泄漏
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder = null;
        if (view == null){
            view = View.inflate(context, R.layout.shouye_child,null);
            holder = new ViewHolder();

            //查找控件
            holder.title = view.findViewById(R.id.title);
            holder.image = view.findViewById(R.id.image);
            //绑定数据
            view.setTag(holder);
        }else {
            //解绑
            holder = (ViewHolder) view.getTag();
        }

        //获取数据重新赋值,图片加载使用自定义配置 ImageLoader
        holder.title.setText(list.get(i).getTitle());
        ImageLoader.getInstance().displayImage(list.get(i).getCover_image_url(),holder.image, ImageLoaderUtil.getDefaultOption());
        return view;
    }

    static class ViewHolder{
        ImageView image;
        TextView title;
    }
}

三.自定义封装网络数据的Bean类(导入Gson包)

四.自定义实现功能的Fragment类

1. 首页:ShouYe_Fragment.java

package fragment;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.google.gson.Gson;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import adapter.MyBaseAdapter;
import adapter.MyPagerAdapter;
import bean.Bean;
import exam.Month.R;
import util.NetWorkUtil;
import util.StringUtil;
import view.XListView;

public class ShouYe_Fragment extends Fragment implements XListView.IXListViewListener{
    private List<Bean.DataBean.ComicsBean>  list = new ArrayList<>();
    private MyBaseAdapter myBaseAdapter;
    private MyPagerAdapter pagerAdapter;
    private ViewPager shouYe_viewPager;
    private LinearLayout linearLayout;
    private List<ImageView> images;
    private XListView xListView;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0){
                int currentItem = shouYe_viewPager.getCurrentItem();
                shouYe_viewPager.setCurrentItem(currentItem+1);

                //延时发送消息
                handler.sendEmptyMessageDelayed(0,3000);
            }
        }
    };

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.shouye_layout, container, false);

        //查找控件
        shouYe_viewPager = view.findViewById(R.id.shouYe_viewPager);
        linearLayout = view.findViewById(R.id.lineLayout);
        xListView = view.findViewById(R.id.xListView);

        //设置用XListView实现多条目加载,可以上拉刷新下拉加载更多
        xListView.setPullLoadEnable(true);
        xListView.setPullRefreshEnable(true);

        //xlistview的监听事件
        xListView.setXListViewListener(this);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        //判断网络,用HttpUrlConnection请求网络数据
        if (NetWorkUtil.isNetConnectioned(getActivity())){
            getData();
        }else {
            NetWorkUtil.setNetConnectionWork(getActivity());
        }
        //设置无限轮播图的初始位置,轮播图每3秒切换一张
        shouYe_viewPager.setCurrentItem(list.size()%100000);
        handler.sendEmptyMessageDelayed(0,3000);

        //shouYe_viewPager.
    }

    public void getData() {
        AsyncTask<String,String,String>  task = new AsyncTask<String, String, String>() {
            @Override
            protected String doInBackground(String... strings) {
                try {
                    //路径
                    String path = "http://api.kkmh.com/v1/daily/comic_lists/0?since=0&gender=0&sa_event=eyJwcm9qZWN0Ijoia3VhaWthbl9hcHAiLCJ0aW1lIjoxNDg3NzQyMjQwNjE1LCJwcm9wZXJ0aWVzIjp7IkhvbWVwYWdlVGFiTmFtZSI6IueDremXqCIsIlZDb21tdW5pdHlUYWJOYW1lIjoi54Ot6ZeoIiwiJG9zX3ZlcnNpb24iOiI0LjQuMiIsIkdlbmRlclR5cGUiOiLlpbPniYgiLCJGcm9tSG9tZXBhZ2VUYWJOYW1lIjoi54Ot6ZeoIiwiJGxpYl92ZXJzaW9uIjoiMS42LjEzIiwiJG5ldHdvcmtfdHlwZSI6IldJRkkiLCIkd2lmaSI6dHJ1ZSwiJG1hbnVmYWN0dXJlciI6ImJpZ25veCIsIkZyb21Ib21lcGFnZVVwZGF0ZURhdGUiOjAsIiRzY3JlZW5faGVpZ2h0IjoxMjgwLCJIb21lcGFnZVVwZGF0ZURhdGUiOjAsIlByb3BlcnR5RXZlbnQiOiJSZWFkSG9tZVBhZ2UiLCJGaW5kVGFiTmFtZSI6IuaOqOiNkCIsImFidGVzdF9ncm91cCI6MTEsIiRzY3JlZW5fd2lkdGgiOjcyMCwiJG9zIjoiQW5kcm9pZCIsIlRyaWdnZXJQYWdlIjoiSG9tZVBhZ2UiLCIkY2FycmllciI6IkNoaW5hIE1vYmlsZSIsIiRtb2RlbCI6IlZQaG9uZSIsIiRhcHBfdmVyc2lvbiI6IjMuNi4yIn0sInR5cGUiOiJ0cmFjayIsImRpc3RpbmN0X2lkIjoiQTo2YWRkYzdhZTQ1MjUwMzY1Iiwib3JpZ2luYWxfaWQiOiJBOjZhZGRjN2FlNDUyNTAzNjUiLCJldmVudCI6IlJlYWRIb21lUGFnZSJ9 ";
                    //设置连接网络
                    URL url = new URL(path);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(5000);
                    connection.setReadTimeout(5000);

                    //响应数据
                    int responseCode = connection.getResponseCode();
                    if (responseCode == 200){
                        //解析数据
                        InputStream inputStream = connection.getInputStream();
                        String json = StringUtil.streamToString(inputStream,"utf-8");
                        return json;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return "";
            }

            @Override
            protected void onPostExecute(String result) {
                //解析数据的路径
                Bean bean = new Gson().fromJson(result, Bean.class);
                list.addAll(bean.getData().getComics());

                //初始化小圆点
                initCircle();

                //设置适配器
                setAdapter();

                //数据加载展示完之后...停止加载
                xListView.stopLoadMore();
            }
        };
        task.execute();
    }


    private void initCircle() {
        //首先需要一个集合记录这些小圆点的图片,,,,当页面切换的时候,可以从集合中取出imageView进行显示图片的设置
        images = new ArrayList<>();
        //再清除线性布局中的view视图
        linearLayout.removeAllViews();

        //遍历集合数据对应的圆点
        for (int i = 0;i<list.size();i++){
            //先初始化一个ImageView视图
            ImageView imageView = new ImageView(getActivity());

            //再设置小圆点的颜色
            if (i == 0){
                imageView.setImageResource(R.drawable.shape_select);
            }else {
                imageView.setImageResource(R.drawable.shape_select_no);
            }

            //然后把设置好的视图添加到集合中
            images.add(imageView);

            //最后把视图添加到线性布局中显示
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            params.setMargins(5,0,5,0);
            linearLayout.addView(imageView,params);
        }
    }

    //设置适配器的方法
    public void  setAdapter(){
        //设置无限轮播图的适配器
        if (pagerAdapter == null){
            pagerAdapter = new MyPagerAdapter(getActivity(), list);
            shouYe_viewPager.setAdapter(pagerAdapter);

            //设置viewpager的监听事件
            shouYe_viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                }

                @Override
                public void onPageSelected(int position) {
                    //设置圆点的颜色,实现小圆点跟随轮播图一起切换
                    for (int i = 0 ;i<images.size();i++){
                        if (i == position%images.size()){
                            images.get(i).setImageResource(R.drawable.shape_select);
                        }else {
                            images.get(i).setImageResource(R.drawable.shape_select_no);
                        }
                    }
                }

                @Override
                public void onPageScrollStateChanged(int state) {
                }
            });
        }

        //设置加载数据的适配器
        if (myBaseAdapter == null){
            myBaseAdapter = new MyBaseAdapter(getActivity(), list);
            xListView.setAdapter(myBaseAdapter);
        }else {
            myBaseAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onRefresh() {
        //下拉刷新数据
        if (NetWorkUtil.isNetConnectioned(getActivity())){
            refreshData();
        }else {
            NetWorkUtil.setNetConnectionWork(getActivity());
        }
    }

    public void refreshData() {
        AsyncTask<String,String,String>  task = new AsyncTask<String, String, String>() {
            @Override
            protected String doInBackground(String... strings) {
                try {
                    //路径
                    String path = "http://api.kkmh.com/v1/daily/comic_lists/0?since=0&gender=0&sa_event=eyJwcm9qZWN0Ijoia3VhaWthbl9hcHAiLCJ0aW1lIjoxNDg3NzQyMjQwNjE1LCJwcm9wZXJ0aWVzIjp7IkhvbWVwYWdlVGFiTmFtZSI6IueDremXqCIsIlZDb21tdW5pdHlUYWJOYW1lIjoi54Ot6ZeoIiwiJG9zX3ZlcnNpb24iOiI0LjQuMiIsIkdlbmRlclR5cGUiOiLlpbPniYgiLCJGcm9tSG9tZXBhZ2VUYWJOYW1lIjoi54Ot6ZeoIiwiJGxpYl92ZXJzaW9uIjoiMS42LjEzIiwiJG5ldHdvcmtfdHlwZSI6IldJRkkiLCIkd2lmaSI6dHJ1ZSwiJG1hbnVmYWN0dXJlciI6ImJpZ25veCIsIkZyb21Ib21lcGFnZVVwZGF0ZURhdGUiOjAsIiRzY3JlZW5faGVpZ2h0IjoxMjgwLCJIb21lcGFnZVVwZGF0ZURhdGUiOjAsIlByb3BlcnR5RXZlbnQiOiJSZWFkSG9tZVBhZ2UiLCJGaW5kVGFiTmFtZSI6IuaOqOiNkCIsImFidGVzdF9ncm91cCI6MTEsIiRzY3JlZW5fd2lkdGgiOjcyMCwiJG9zIjoiQW5kcm9pZCIsIlRyaWdnZXJQYWdlIjoiSG9tZVBhZ2UiLCIkY2FycmllciI6IkNoaW5hIE1vYmlsZSIsIiRtb2RlbCI6IlZQaG9uZSIsIiRhcHBfdmVyc2lvbiI6IjMuNi4yIn0sInR5cGUiOiJ0cmFjayIsImRpc3RpbmN0X2lkIjoiQTo2YWRkYzdhZTQ1MjUwMzY1Iiwib3JpZ2luYWxfaWQiOiJBOjZhZGRjN2FlNDUyNTAzNjUiLCJldmVudCI6IlJlYWRIb21lUGFnZSJ9 ";
                    //设置连接网络
                    URL url = new URL(path);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(5000);
                    connection.setReadTimeout(5000);

                    //响应数据
                    int responseCode = connection.getResponseCode();
                    if (responseCode == 200){
                        //解析数据
                        InputStream inputStream = connection.getInputStream();
                        String json = StringUtil.streamToString(inputStream,"utf-8");
                        return json;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return "";
            }

            @Override
            protected void onPostExecute(String result) {
                //解析数据的路径
                Bean bean = new Gson().fromJson(result, Bean.class);
                list.addAll(0,bean.getData().getComics());

                //设置适配器
                setAdapter();

                //停止刷新
                xListView.stopRefresh();

                //设置本次刷新的时间
                Date date = new Date(System.currentTimeMillis());
                SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
                xListView.setRefreshTime(dateFormat.format(date));
            }
        };
        task.execute();
    }

    @Override
    public void onLoadMore() {
        //上拉加载更多数据
        if (NetWorkUtil.isNetConnectioned(getActivity())){
            getDataFromNet();
        }else {
            NetWorkUtil.setNetConnectionWork(getActivity());
        }
    }

    public void getDataFromNet() {
        AsyncTask<String,String,String>  task = new AsyncTask<String, String, String>() {
            @Override
            protected String doInBackground(String... strings) {
                try {
                    //路径
                    String path = "http://api.kkmh.com/v1/daily/comic_lists/0?since=0&gender=0&sa_event=eyJwcm9qZWN0Ijoia3VhaWthbl9hcHAiLCJ0aW1lIjoxNDg3NzQyMjQwNjE1LCJwcm9wZXJ0aWVzIjp7IkhvbWVwYWdlVGFiTmFtZSI6IueDremXqCIsIlZDb21tdW5pdHlUYWJOYW1lIjoi54Ot6ZeoIiwiJG9zX3ZlcnNpb24iOiI0LjQuMiIsIkdlbmRlclR5cGUiOiLlpbPniYgiLCJGcm9tSG9tZXBhZ2VUYWJOYW1lIjoi54Ot6ZeoIiwiJGxpYl92ZXJzaW9uIjoiMS42LjEzIiwiJG5ldHdvcmtfdHlwZSI6IldJRkkiLCIkd2lmaSI6dHJ1ZSwiJG1hbnVmYWN0dXJlciI6ImJpZ25veCIsIkZyb21Ib21lcGFnZVVwZGF0ZURhdGUiOjAsIiRzY3JlZW5faGVpZ2h0IjoxMjgwLCJIb21lcGFnZVVwZGF0ZURhdGUiOjAsIlByb3BlcnR5RXZlbnQiOiJSZWFkSG9tZVBhZ2UiLCJGaW5kVGFiTmFtZSI6IuaOqOiNkCIsImFidGVzdF9ncm91cCI6MTEsIiRzY3JlZW5fd2lkdGgiOjcyMCwiJG9zIjoiQW5kcm9pZCIsIlRyaWdnZXJQYWdlIjoiSG9tZVBhZ2UiLCIkY2FycmllciI6IkNoaW5hIE1vYmlsZSIsIiRtb2RlbCI6IlZQaG9uZSIsIiRhcHBfdmVyc2lvbiI6IjMuNi4yIn0sInR5cGUiOiJ0cmFjayIsImRpc3RpbmN0X2lkIjoiQTo2YWRkYzdhZTQ1MjUwMzY1Iiwib3JpZ2luYWxfaWQiOiJBOjZhZGRjN2FlNDUyNTAzNjUiLCJldmVudCI6IlJlYWRIb21lUGFnZSJ9 ";
                    //设置连接网络
                    URL url = new URL(path);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(5000);
                    connection.setReadTimeout(5000);

                    //响应数据
                    int responseCode = connection.getResponseCode();
                    if (responseCode == 200){
                        //解析数据
                        InputStream inputStream = connection.getInputStream();
                        String json = StringUtil.streamToString(inputStream,"utf-8");
                        return json;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return "";
            }

            @Override
            protected void onPostExecute(String result) {
                //解析数据的路径
                Bean bean = new Gson().fromJson(result, Bean.class);
                list.addAll(bean.getData().getComics());

                //设置适配器
                setAdapter();

                //数据加载展示完之后...停止加载
                xListView.stopLoadMore();
            }
        };
        task.execute();
    }

}

2. 其它fragment自定义


五. 自定义工具类:

1.  配置ImageLoader类:

(1)BaseApplication.java

package util;

import android.app.Application;
//全局初始化Application类
public class BaseApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        //配置imageLoader
        ImageLoaderUtil.init(this);
    }
}

(2)ImageLoaderUtil.java

package util;

import android.content.Context;
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.decode.BaseImageDecoder;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.utils.StorageUtils;
import java.io.File;
import exam.Month.R;
public class ImageLoaderUtil {
    /**
     * 初始化imageLoader
     * @param context
     */
    public static void init(Context context) {
        //1.获取配置config对象
        File cacheDir = StorageUtils.getCacheDirectory(context);  //缓存文件夹路径

        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)

                .threadPoolSize(3) // default  线程池内加载的数量
                .threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级
                .tasksProcessingOrder(QueueProcessingType.FIFO) // default
                .denyCacheImageMultipleSizesInMemory()
                .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
                .memoryCacheSize(2 * 1024 * 1024)  // 内存缓存的最大值
                .memoryCacheSizePercentage(13) // default
                .diskCache(new UnlimitedDiskCache(cacheDir)) // default 可以自定义缓存路径
                .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
                .diskCacheFileCount(100)  // 可以缓存的文件数量
                // default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
                .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
                .imageDownloader(new BaseImageDownloader(context)) // default
                .imageDecoder(new BaseImageDecoder(true)) // default
                .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
                .writeDebugLogs() // 打印debug log
                .build(); //开始构建


        //2.初始化配置...ImageLoader.getInstance()图片加载器的对象,单例模式
        ImageLoader.getInstance().init(config);
    }

    /**
     * imageLoader加载图片的默认选项
     * @return
     */
    public static DisplayImageOptions getDefaultOption(){

        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.micro_pic) // 设置图片下载期间显示的默认图片
                .showImageForEmptyUri(R.drawable.micro_pic) // 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.drawable.micro_pic) // 设置图片加载或解码过程中发生错误显示的图片
                .resetViewBeforeLoading(true)  // default 设置图片在加载前是否重置、复位
                .delayBeforeLoading(1000)  // 下载前的延迟时间
                .cacheInMemory(true) // default  设置下载的图片是否缓存在内存中
                .cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中

                .considerExifParams(true) // default
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型

                .displayer(new SimpleBitmapDisplayer()) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)

                .build();

        return options;
    }

    /**
     * imageLoader加载圆角图片....指定圆角的大小
     * @return
     */
    public static DisplayImageOptions getRoundedOption(int corner){

        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.micro_pic) // 设置图片下载期间显示的图片
                .showImageForEmptyUri(R.drawable.micro_pic) // 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.drawable.micro_pic) // 设置图片加载或解码过程中发生错误显示的图片
                .resetViewBeforeLoading(true)  // default 设置图片在加载前是否重置、复位
                .delayBeforeLoading(1000)  // 下载前的延迟时间
                .cacheInMemory(true) // default  设置下载的图片是否缓存在内存中
                .cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中

                .considerExifParams(true) // default
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型

                .displayer(new RoundedBitmapDisplayer(corner)) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)

                .build();

        return options;
    }

    /**
     * imageLoader加载圆形图片
     * @return
     */
    public static DisplayImageOptions getCircleOption(){

        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.micro_pic) // 设置图片下载期间显示的图片
                .showImageForEmptyUri(R.drawable.micro_pic) // 设置图片Uri为空或是错误的时候显示的图片
                .showImageOnFail(R.drawable.micro_pic) // 设置图片加载或解码过程中发生错误显示的图片
                .resetViewBeforeLoading(true)  // default 设置图片在加载前是否重置、复位
                .delayBeforeLoading(1000)  // 下载前的延迟时间
                .cacheInMemory(true) // default  设置下载的图片是否缓存在内存中
                .cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中

                .considerExifParams(true) // default
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示
                .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型

                .displayer(new CircleBitmapDisplayer()) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)

                .build();

        return options;
    }
}

2. 判断和设置网络:

NetWorkUtil.java

package util;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.provider.Settings;

//判断网络是否连接可用的工具类
public class NetWorkUtil {

    /**
     * 判断是否有网络连接的方法
     */
    public static boolean isNetConnectioned(Context context){
        //1. 获取网络连接对象
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        //2. 获取NetworkInfo对象,获取网络连接的信息
        NetworkInfo info = manager.getActiveNetworkInfo();

        //3. 信息不为空时,就代表网络可用
        if (info != null){
            return info.isAvailable();
        }
        return false;
    }

    /**
     * 网络无连接时跳转页面,弹出对话框进行网络的设置
     */
    public static void setNetConnectionWork(final Context context){
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("网络加载错误!");
        builder.setMessage("网络连接不可用,是否设置网络?");
        builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                //跳转到系统的设置网络的界面
                Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
                context.startActivity(intent);
            }
        });
        builder.setNegativeButton("取消",null);
        builder.show();
    }
}

3. 解析json数据:

StringUtil.java

package util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class StringUtil {

    //解析数据的方法
    public static String streamToString(InputStream inputStream, String charset) {
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String s = null;
            StringBuilder builder = new StringBuilder();
            while ((s = bufferedReader.readLine()) != null){
                builder.append(s);
            }

            bufferedReader.close();
            return builder.toString();

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

        return  null;
    }
}

六. 封装XListView的工具类(自己导入view包下的3个java类)


七. 自定义布局文件:

1. 设置字体颜色的color文件夹下的 color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="true" android:color="@color/selected"></item>
    <item android:state_checked="false" android:color="@color/defaulted"></item>
</selector>

2. 设置小圆点颜色的drawable文件夹:

(1)shape_select.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#da450b"></solid>
    <corners android:radius="5dp"></corners>
    <size android:width="5dp" android:height="5dp"></size>
</shape>

(2)shape_select_no.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#af8c8c"></solid>
    <corners android:radius="5dp"></corners>
    <size android:width="5dp" android:height="5dp"></size>
</shape>

3.layout文件夹下:

(1)activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.ViewPager
        android:id="@+id/main_viewPager"
        android:layout_width="match_parent"
        android:layout_above="@+id/groups"
        android:layout_height="match_parent"></android.support.v4.view.ViewPager>

    <RadioGroup
        android:id="@+id/groups"
        android:orientation="horizontal"
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">

        <RadioButton
            android:text="首页"
            android:checked="true"
            android:layout_weight="1"
            style="@style/ButtonStyle"
            android:layout_width="0dp"
            android:id="@+id/button_01"
            android:textColor="@color/color"
            android:layout_height="wrap_content" />
        <RadioButton
            android:text="发现"
            android:layout_weight="1"
            style="@style/ButtonStyle"
            android:layout_width="0dp"
            android:id="@+id/button_02"
            android:textColor="@color/color"
            android:layout_height="wrap_content" />
        <RadioButton
            android:text="V 社区"
            android:layout_weight="1"
            style="@style/ButtonStyle"
            android:layout_width="0dp"
            android:id="@+id/button_03"
            android:textColor="@color/color"
            android:layout_height="wrap_content" />
        <RadioButton
            android:text="我的"
            android:layout_weight="1"
            style="@style/ButtonStyle"
            android:layout_width="0dp"
            android:id="@+id/button_04"
            android:textColor="@color/color"
            android:layout_height="wrap_content" />

    </RadioGroup>
</RelativeLayout>

(2)shouye_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="288dp"
        android:id="@+id/relative">

        <android.support.v4.view.ViewPager
            android:layout_width="match_parent"
            android:id="@+id/shouYe_viewPager"
            android:layout_height="match_parent"></android.support.v4.view.ViewPager>

        <LinearLayout
            android:id="@+id/lineLayout"
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:layout_centerHorizontal="true"
            android:layout_alignBottom="@+id/shouYe_viewPager"  ></LinearLayout>
    </RelativeLayout>

    <view.XListView
        android:scrollbars="none"
        android:id="@+id/xListView"
        android:layout_marginTop="8dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal"  ></view.XListView>
</LinearLayout>

(3)shouye_child.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_marginTop="10dp"
        android:layout_height="250dp"
        android:scaleType="fitXY"
        android:id="@+id/image"    />

    <TextView
        android:id="@+id/title"
        android:textSize="18sp"
        android:padding="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:layout_gravity="center_horizontal" />
</LinearLayout>

4. 自己设置values文件夹下设置 字体颜色,RadioButton按钮的style,xlistview的string


八. 在AndroidManifest.xml

1. 设置请求网络权限,文件的读、写权限,网络状态权限

2. 声明imageloader的name属性



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值