(一)---网络工具类
创建网络工具类他的Kind是Singleton
网络获取有两种方法
Thread+HttpUrlConnection/HttpClient+Handler
AsyncTask+HttpUrlConnection/HttpClient
//获取他的网络地址
public void getDataFromService(String url) {
new LoadData().execute(url);
}
//接口回调实现过程
1. 定义一个接口
2. 声明一个引用
3. 给引用设值
public interface NetCallback {
void onSuccess(String result);
}
private NetCallback netCallback;
public void setNetCallback(NetCallback netCallback) {
this.netCallback = netCallback;
}
//请求网络数据的类
class LoadData extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... strings) {
// 网络请求
try {
URL url = new URL(strings[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
return CharStreams.toString(new InputStreamReader(connection.getInputStream(), "UTF-8"));
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
if (netCallback != null) {
netCallback.onSuccess(s);
}
}
}
(二)----MainActivity调用网络工具类
工具类写完后可以无限调用并且MainActivity中声明网络地址:例如
private String url = "https://www.apiopen.top/journalismApi"
然后在onCreate方法中可以直接调用网络工具类
mutiple_list = findViewById(R.id.mutiple_list);
//调用写好的工具类
netUtils = NetUtils.getInstance();
netUtils.getDataFromService(url);
netUtils.setNetCallback(new NetUtils.NetCallback() {
@Override
public void onSuccess(String result) {
// 解析数据 并设置多条目显示
Gson gson = new Gson();
MutipleBean mutipleBean = gson.fromJson(result, MutipleBean.class);
mutiple_list.setAdapter(new MutipleListAdapter(MainActivity.this, mutipleBean.getData().getTech()));
}
});
}
(三)-----多条目的adapter设置
//多条目需要先自定义条目类型:例如
//条目类型
private final int item_type_one = 1;
private final int item_type_two = 2;
//重写两个方法:getItemViewType和getViewTypeCount
代码例如:
public class MutipleListAdapter extends BaseAdapter{
Context context;
List<MutipleBean.DataBean.TechBean> beans;
public MutipleListAdapter(Context context, List<MutipleBean.DataBean.TechBean> beans) {
this.context = context;
this.beans = beans;
}
//条目类型
private final int item_type_one = 1;
private final int item_type_two = 2;
@Override
public int getCount() {
return beans.size();
}
@Override
public Object getItem(int position) {
return beans.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//重写两个方法
@Override
public int getItemViewType(int position) {
List<MutipleBean.DataBean.TechBean.PicInfoBean> picInfo = beans.get(position).getPicInfo();
if (picInfo==null||picInfo.size()==0){
return item_type_one;
}
return item_type_two;
}
@Override
public int getViewTypeCount() {
return 3;//条目样式+1
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//获取条目类型判断
int viewType = getItemViewType(position);
switch (viewType){
case item_type_one:
//创建视图1
ViewHolderOne holderOne = null;
if (convertView==null){
holderOne = new ViewHolderOne();
convertView = LayoutInflater.from(context).inflate(R.layout.one_layout,null,false);
holderOne.tvTitle = convertView.findViewById(R.id.one_text);
convertView.setTag(holderOne);
}else{
holderOne = (ViewHolderOne)convertView.getTag();
}
holderOne.tvTitle.setText(beans.get(position).getTitle());
break;
case item_type_two:
//创建视图2
ViewHolderTwo holderTwo = null;
if (convertView==null){
holderTwo = new ViewHolderTwo();
convertView = LayoutInflater.from(context).inflate(R.layout.two_layout,null,false);
holderTwo.tvTitle = convertView.findViewById(R.id.teo_text);
holderTwo.ivImage = convertView.findViewById(R.id.teo_image);
convertView.setTag(holderTwo);
}else{
holderTwo = (ViewHolderTwo)convertView.getTag();
}
holderTwo.tvTitle.setText(beans.get(position).getTitle());
//设置图片
ImageLoader.getInstance().displayImage(beans.get(position).getPicInfo().get(0).getUrl(),holderTwo.ivImage);
break;
}
return convertView;
}
class ViewHolderOne{
TextView tvTitle;
}
class ViewHolderTwo{
TextView tvTitle;
ImageView ivImage;
}
}
(四)----设置图片时---*****注意需要在AndroidManifest中注册全局配置
需要用到ImageLoader的Module包或者自己写全局配置
1.先继承Application
2.重写onCreate()方法
3.创建一个文件再设置他的各种属性
例如:(完整版)
private void initLoader() {
// DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.
// See the sample project how to use ImageLoader correctly.
// 缓存目录
File cacheDir = StorageUtils.getOwnCacheDirectory(getApplicationContext(), "/images");
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, null)
.threadPoolSize(3) // 线程池数量
.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)) // 内存卡缓存
.diskCacheSize(50 * 1024 * 1024) // 内存卡缓存大小
.diskCacheFileCount(100) // 缓存文件数量
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
//.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.defaultDisplayImageOptions(createDisplayOption()) // default
.writeDebugLogs()
.build();
ImageLoader.getInstance().init(config);
}
private DisplayImageOptions createDisplayOption() {
// DON'T COPY THIS CODE TO YOUR PROJECT! This is just example of ALL options using.
// See the sample project how to use ImageLoader correctly.
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher_background) // resource or drawable
.showImageForEmptyUri(R.drawable.ic_launcher_background) // resource or drawable
.showImageOnFail(R.drawable.ic_launcher_background) // resource or drawable
.resetViewBeforeLoading(false) // default
.delayBeforeLoading(1000)
.cacheInMemory(true) // 是否开启内存缓存
.cacheOnDisk(true) // 是否开启SD卡缓存
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.RGB_565) // default
.displayer(new SimpleBitmapDisplayer()) // default
//.displayer(new RoundedBitmapDisplayer(40)) // default
//.displayer(new CircleBitmapDisplayer()) // default
.build();
return options;
}
例如1:简化版(也可实现功能但是效果欠佳)
@Override
public void onCreate() {
super.onCreate();
onData();
}
private void onData() {
File cacheDirectory = StorageUtils.getOwnCacheDirectory(getApplicationContext(), "/image");
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).build();
ImageLoader.getInstance().init(config);
}
private DisplayImageOptions createDisplayOption() {
DisplayImageOptions options = new DisplayImageOptions.Builder()
.build();
return options;
}
例如2:简化版(效果勉强且简洁,推荐使用)
private void initImage() {
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(getApplicationContext())
.defaultDisplayImageOptions(options())
.build();
ImageLoader.getInstance().init(configuration);
}
private DisplayImageOptions options() {
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheOnDisk(true)
.cacheInMemory(true)
.displayer(new SimpleBitmapDisplayer())
.build();
return options;
}