图片使用Universal-Image-Loader加载并设置内存和sd卡缓存,导入XListView库,并实现下拉刷新、上拉加载更多。
1.MainActivity
package com.example.zuoye0112; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.google.gson.Gson; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ViewPager viewPager; private TextView text_subhead; private TextView text_title; private Button button_tiaozhuan; private String url = "http://120.27.23.105/product/getProductDetail?pid=1&source=android"; private RequestData requestData; private List<String> listurl = new ArrayList<>(); private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //获取当前页面显示的值 int item = viewPager.getCurrentItem(); item++; viewPager.setCurrentItem(item); //发送延迟消息 handler.sendEmptyMessageDelayed(0,1000); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到资源控件的ID viewPager = findViewById(R.id.view_pager); text_subhead = findViewById(R.id.text_subhead); text_title = findViewById(R.id.text_title); button_tiaozhuan = findViewById(R.id.button_tiaozhuan); //网络请求 requeastNetData(); //设置点击事件 button_tiaozhuan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, Main2Activity.class); startActivity(intent); finish(); } }); } private void requeastNetData() { MyTask myTask = new MyTask(new MyTask.Icallbacks() { @Override public void updateUiByjson(String jsonstr) { Gson gson = new Gson(); requestData = gson.fromJson(jsonstr, RequestData.class); RequestData.DataBean data = requestData.getData(); String images = data.getImages(); String[] split = images.split("\\|"); for (int i = 0; i <split.length ; i++) { listurl.add(split[i]); } text_subhead.setText(data.getSubhead()); text_title.setText(data.getTitle()); //设置适配器 setvpAdapter(); //设置图片显示在中间 viewPager.setCurrentItem(listurl.size()*10000); //发送延迟消息 handler.sendEmptyMessageDelayed(0,1000); } }); myTask.execute(url); } private void setvpAdapter() { MyvpAdapter myvpAdapter = new MyvpAdapter(MainActivity.this, listurl); viewPager.setAdapter(myvpAdapter); } }2.布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.zuoye0112.MainActivity"> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_weight="5" android:layout_height="0dp"> </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="match_parent" android:layout_weight="4" android:orientation="vertical" android:layout_height="0dp"> <TextView android:id="@+id/text_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="稻香村" /> <TextView android:id="@+id/text_subhead" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="每个中秋都不能简单" /> </LinearLayout> <Button android:id="@+id/button_tiaozhuan" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:text="跳转"/> </LinearLayout>3.MyVpAdapter实现无线轮播的适配器
package com.example.zuoye0112; import android.content.Context; import android.graphics.Bitmap; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import java.util.List; /** * Created by dell on 2018/1/12. */ class MyvpAdapter extends PagerAdapter{ private Context context; private List<String> data; private DisplayImageOptions options; public MyvpAdapter(Context context, List<String> data) { this.context=context; this.data=data; options=new DisplayImageOptions.Builder() .cacheInMemory(true)//使用内存缓存 .cacheOnDisk(true)//使用磁盘缓存 .showImageOnLoading(R.mipmap.ic_launcher)//设置正在下载的图片 .showImageForEmptyUri(R.mipmap.ic_launcher)//url为空或请求的资源不存在时 .showImageOnFail(R.mipmap.ic_launcher)//下载失败时显示的图片 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片色彩模式 .imageScaleType(ImageScaleType.EXACTLY)//设置图片的缩放模式===imageView,,ScaleType .displayer(new RoundedBitmapDisplayer(50))//设置图片圆角显示 弧度 .build(); } @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 imageView = new ImageView(context); //异步获取图片 ImageLoader.getInstance().displayImage(data.get(position%data.size()),imageView,options); //将控件添加到容器 container.addView(imageView); //返回容器 return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }4.Main2Activity
package com.example.zuoye0112; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.GridView; import android.widget.Toast; import com.bawei.jane.mxlistview.view.XListView; import com.google.gson.Gson; import java.util.List; public class Main2Activity extends AppCompatActivity { private XListView xListView; private int index=1; private int type=1;//1.刷新。2.加载 private String url = "http://120.27.23.105/product/getProductCatagory?cid=1"; private RequestData2 requestData2; private GridView gridView; private MyAdapter2 myAdapter2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); //找到资源控件的ID xListView = findViewById(R.id.x_listview); //设置支持上拉加载,下拉刷新的功能 xListView.setPullLoadEnable(true); xListView.setPullRefreshEnable(true); //设置监听 xListView.setXListViewListener(new XListView.IXListViewListener() { @Override//下拉刷新 public void onRefresh() { NetData(); } @Override//上拉加载 public void onLoadMore() { Toast.makeText(Main2Activity.this,"加载更多",Toast.LENGTH_SHORT).show(); xListView.stopLoadMore(); } }); //设置请求网络 NetData(); xListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { List<RequestData2.DataBean> data = requestData2.getData(); data.remove(i); myAdapter2.notifyDataSetChanged(); return false; } }); } public void NetData() { if(NetStateUtil.isConn(Main2Activity.this)){ MyTask myTask = new MyTask(new MyTask.Icallbacks() { @Override public void updateUiByjson(String jsonstr) { Gson gson = new Gson(); requestData2 = gson.fromJson(jsonstr, RequestData2.class); setAdapter2(); xListView.stopLoadMore(); xListView.stopRefresh(); } }); myTask.execute(url); } } private void setAdapter2() { myAdapter2 = new MyAdapter2(Main2Activity.this, requestData2.getData()); xListView.setAdapter(myAdapter2); } }5.布局2
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.zuoye0112.Main2Activity"> <com.bawei.jane.mxlistview.view.XListView android:id="@+id/x_listview" android:layout_width="match_parent" android:layout_height="match_parent"> </com.bawei.jane.mxlistview.view.XListView> </LinearLayout>6.显示数据的适配器
package com.example.zuoye0112; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.TextView; import java.util.List; /** * Created by dell on 2018/1/12. */ class MyAdapter2 extends BaseAdapter{ private Context context; private List<RequestData2.DataBean> data; public MyAdapter2(Context context, List<RequestData2.DataBean> data) { this.data=data; this.context=context; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int i) { return data.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder; if(view==null){ view=View.inflate(context,R.layout.item,null); holder = new ViewHolder(); holder.name=view.findViewById(R.id.text_name); holder.gridView=view.findViewById(R.id.grid_view); view.setTag(holder); }else{ holder = (ViewHolder) view.getTag(); } holder.name.setText(data.get(i).getName()); holder.gridView.setAdapter(new MygvAdapter(context,data.get(i).getList())); return view; } class ViewHolder{ TextView name; GridView gridView; } }7.自定义GridView
package com.example.zuoye0112; import android.content.Context; import android.util.AttributeSet; import android.widget.GridView; /** * Created by dell on 2018/1/12. */ public class MyGridView extends GridView{ public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int i = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, i); } }8.MyGvAdapter:实现GridView的适配器
package com.example.zuoye0112; import android.content.Context; import android.graphics.Bitmap; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.TextView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import java.util.List; /** * Created by dell on 2018/1/12. */ class MygvAdapter extends BaseAdapter { private Context context; private List<RequestData2.DataBean.ListBean> list; private DisplayImageOptions options; public MygvAdapter(Context context, List<RequestData2.DataBean.ListBean> list) { this.context=context; this.list=list; options=new DisplayImageOptions.Builder() .cacheInMemory(true)//使用内存缓存 .cacheOnDisk(true)//使用磁盘缓存 .showImageOnLoading(R.mipmap.ic_launcher)//设置正在下载的图片 .showImageForEmptyUri(R.mipmap.ic_launcher)//url为空或请求的资源不存在时 .showImageOnFail(R.mipmap.ic_launcher)//下载失败时显示的图片 .bitmapConfig(Bitmap.Config.RGB_565)//设置图片色彩模式 .imageScaleType(ImageScaleType.EXACTLY)//设置图片的缩放模式===imageView,,ScaleType .displayer(new RoundedBitmapDisplayer(50))//设置图片圆角显示 弧度 .build(); } @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; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder; if(view==null){ view = View.inflate(context,R.layout.tiem1,null); holder = new ViewHolder(); holder.icon=view.findViewById(R.id.image_icon); holder.name=view.findViewById(R.id.text_name); view.setTag(holder); }else{ holder = (ViewHolder) view.getTag(); } holder.name.setText(list.get(i).getName()); ImageLoader.getInstance().displayImage(list.get(i).getIcon(),holder.icon,options); return view; } class ViewHolder{ ImageView icon; TextView name; } }9.MyApplication工具类
package com.example.zuoye0112; import android.app.Application; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import java.io.File; /** * Created by jane on 2018/1/9. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); //需要识记的是以下几个参数: File cacheFile=getExternalCacheDir(); ImageLoaderConfiguration config=new ImageLoaderConfiguration.Builder(this) .memoryCacheExtraOptions(480, 800)//缓存图片最大的长和宽 .threadPoolSize(2)//线程池的数量 .threadPriority(4) .memoryCacheSize(2*1024*1024)//设置内存缓存区大小 .diskCacheSize(20*1024*1024)//设置sd卡缓存区大小 .diskCache(new UnlimitedDiscCache(cacheFile))//自定义缓存目录 .writeDebugLogs()//打印日志内容 .diskCacheFileNameGenerator(new Md5FileNameGenerator())//给缓存的文件名进行md5加密处理 .build(); ImageLoader.getInstance().init(config); } }10.MyTask的工具类
package com.example.zuoye0112; import android.os.AsyncTask; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; /** * 使用AsyncTask+HttpURLConnection请求数据 * Created by e531 on 2017/10/12. */ public class MyTask extends AsyncTask<String,Void,String> { //申请一个接口类对象 private Icallbacks icallbacks; //定义有参构造方法 public MyTask(Icallbacks icallbacks) { this.icallbacks = icallbacks; } @Override protected String doInBackground(String... params) { String str=""; try { //使用HttpUrlConnection URL url=new URL(params[0]); HttpURLConnection connection=(HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); if(connection.getResponseCode()==200){ InputStream inputStream=connection.getInputStream(); //调用工具类中的静态方法 str=StreamToString.streamToStr(inputStream,"utf-8"); } } catch (MalformedURLException e) { e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } return str; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); //解析,封装到bean,更新ui组件 icallbacks.updateUiByjson(s); } //定义一个接口 public interface Icallbacks{ /** * 根据回传的json字符串,解析并更新页面组件 * @param jsonstr */ void updateUiByjson(String jsonstr); } }11.NetStateUtil工具类
package com.example.zuoye0112; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; /** * 得到网络状态的工具类 * Created by e531 on 2017/10/16. */ public class NetStateUtil { /* * 判断网络连接是否已开 * true 已打开 false 未打开 * */ public static boolean isConn(Context context){ boolean bisConnFlag=false; ConnectivityManager conManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo network = conManager.getActiveNetworkInfo(); if(network!=null){ bisConnFlag=conManager.getActiveNetworkInfo().isAvailable(); } return bisConnFlag; } /** * 当判断当前手机没有网络时选择是否打开网络设置 * @param context */ public static void showNoNetWorkDlg(final Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setIcon(R.mipmap.ic_launcher) // .setTitle(R.string.app_name) // .setMessage("当前无网络").setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 跳转到系统的网络设置界面 Intent intent = null; // 先判断当前系统版本 if(android.os.Build.VERSION.SDK_INT > 10){ // 3.0以上 intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS); }else{ intent = new Intent(); intent.setClassName("com.android.settings", "com.android.settings.WirelessSettings"); } context.startActivity(intent); } }).setNegativeButton("知道了", null).show(); } }12.StreamToString工具类
package com.example.zuoye0112; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; /** * Created by e531 on 2017/10/12. */ public class StreamToString { public static String streamToStr(InputStream inputStream,String chartSet){ StringBuilder builder=new StringBuilder(); try { BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,chartSet)); String con; while ((con=br.readLine())!=null){ builder.append(con); } br.close(); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } }13.条目布局文件1
<?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"> <TextView android:id="@+id/text_name" android:layout_width="match_parent" android:layout_height="wrap_content" /> <com.example.zuoye0112.MyGridView android:id="@+id/grid_view" android:numColumns="3" android:layout_width="match_parent" android:layout_height="match_parent"> </com.example.zuoye0112.MyGridView> </LinearLayout>14.条目布局文件2
<?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" android:padding="10dp"> <ImageView android:id="@+id/image_icon" android:layout_width="80dp" android:layout_height="80dp" android:padding="10dp" android:src="@mipmap/ic_launcher"/> <TextView android:id="@+id/text_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:text="提拉米苏"/> </LinearLayout>15.清单文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.zuoye0112"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Main2Activity"></activity> </application> </manifest>16.实现图片: