题目描述:
模块一:无限轮播+请求网络数据+多条目加载
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属性