抽取网络工具类+++++多条目展示+++++ImageLodler的配置和简化

(一)---网络工具类

创建网络工具类他的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;
}

猜你喜欢

转载自blog.csdn.net/H_BuilDer/article/details/81531460
今日推荐