本文内容

  • 环境
  • 项目结构
  • 演示 1:ListView
  • 演示 2:简单 XListView
  • 演示 3:音乐列表 XListView
  • 演示 4:另一个音乐列表 XListView

本文四个演示,循序渐进。

  • 演示 1 只是普通的 Android ListView 控件;
  • 演示 2 是 GitHub 上的 XListView 控件,具备“下拉更新”和“上拉加载”功能,使用是它自己的示例;
  • 演示 3 是将音乐列表的数据应用到 XListView 控件,但只访问一次网络,“下拉更新”和“上拉加载”时循环利用数据;
  • 演示 4 与演示 3 基本一致,唯一的区别是每次“下拉更新”和“上拉加载”时都访问网络,以便跟实际情况更相近。

下载 github XListView

下载 Demo

更多 Demo

环境


  • Windows 2008 R2 64 位
  • Eclipse ADT V22.6.2,Android 4.4.2(API 19)
  • SAMSUNG GT-8618,Android OS 4.1.2

项目结构


图 1 项目结构(左:Java 包;右:布局文件)

  • com.example.listviewdemo.adapter 包是 android ListView 和 XListView 控件的adaper;
  • com.example.listviewdemo.config 包只有一个类 Urls,类中只有一个关于音乐列表数据网络地址的静态变量;
  • com.example.listviewdemo.dao 包是业务层,根据网络地址获得音乐列表数据;
  • com.example.listviewdemo.ui 包是演示中使用的 Activity;
  • com.example.listviewdemo.utils 包是工具类;
  • com.example.listviewdemo.widget 包是 github 的 XListView 控件。

图 2 主程序界面

演示 1:ListView


利用 AsyncTask 通过网络获得音乐列表数据,数据是 JSON 数组,ListView 控件相应的 adpter 规定了列表中每项是如何显示的。

图 3 演示 1

package com.example.listviewdemo.ui;

 

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

 

import com.example.listviewdemo.R;

import com.example.listviewdemo.adapter.SimpleListAdapter;

import com.example.listviewdemo.dao.MusicDao;

 

import android.os.AsyncTask;

import android.os.Bundle;

import android.app.Activity;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ListView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.AdapterView.OnItemSelectedListener;

 

public class SimpleListActivity extends Activity {

 

    private ListView list;

    private SimpleListAdapter adapter;

    private MusicDao music;

    private JSONArray jsonArray;

 

    /* Button btn; */

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_simplelist);

 

        initClass();

 

        InitListView();

 

        new MyTask().execute(music);

    }

 

    private void initClass() {

        music = new MusicDao();

    }

 

    private void InitListView() {

        list = (ListView) findViewById(R.id.myList_a);

    }

 

    public class MyTask extends AsyncTask<MusicDao, String, String> {

 

        private boolean mUseCache;

 

        public MyTask() {

            mUseCache = true;

        }

 

        public MyTask(boolean useCache) {

            mUseCache = useCache;

        }

 

        @Override

        protected void onPreExecute() {

            super.onPreExecute();

        }

 

        @Override

        protected String doInBackground(MusicDao... params) {

            MusicDao dao = params[0];

            String result = dao.getData();

            return result;

        }

 

        @Override

        protected void onPostExecute(String result) {

            // TODO Auto-generated method stub

            super.onPostExecute(result);

            if (!result.isEmpty()) {

                try {

                    jsonArray = new JSONArray(result);

                    adapter = new SimpleListAdapter(SimpleListActivity.this,

                            jsonArray);

                    list.setAdapter(adapter);

                    list.setOnItemClickListener(new OnItemClickListener() {

 

                        @Override

                        public void onItemClick(AdapterView<?> parent,

                                View view, int position, long id) {

                            JSONObject jObject;

                            try {

                                jObject = (JSONObject) jsonArray.get(position);

                                Toast.makeText(getApplicationContext(),

                                        jObject.getString("artist"),

                                        Toast.LENGTH_SHORT).show();

                            } catch (JSONException e) {

                                // TODO Auto-generated catch block

                                e.printStackTrace();

                            }

                        }

                    });

                    list.setOnItemSelectedListener(new OnItemSelectedListener() {

 

                        @Override

                        public void onItemSelected(AdapterView<?> parent,

                                View view, int position, long id) {

                            JSONObject jObject;

                            try {

                                jObject = (JSONObject) jsonArray.get(position);

                                Toast.makeText(getApplicationContext(),

                                        jObject.getString("artist"),

                                        Toast.LENGTH_SHORT).show();

                            } catch (JSONException e) {

                                // TODO Auto-generated catch block

                                e.printStackTrace();

                            }

                        }

 

                        @Override

                        public void onNothingSelected(AdapterView<?> parent) {

                        }

                    });

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

        }

    }

}

演示 2:简单 XListView


演示了 github 上的 XListView 控件。示例是该控件提供的。XListView 控件提供“下拉更新”和“上拉加载”功能,并可对“下拉”和“上拉”操作启用或禁用,毕竟不是所有场景都同时需要这个两个操作。

图 4 演示 2

package com.example.listviewdemo.ui;

 

import java.util.ArrayList;

 

import org.json.JSONException;

import org.json.JSONObject;

 

import com.example.listviewdemo.R;

import com.example.listviewdemo.widget.XListView;

import com.example.listviewdemo.widget.XListView.IXListViewListener;

 

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.AdapterView.OnItemSelectedListener;

 

public class SimpleXListActivity extends Activity implements IXListViewListener {

    private XListView mListView;

    private ArrayAdapter<String> mAdapter;

    private ArrayList<String> items = new ArrayList<String>();

    private Handler mHandler;

    private int start = 0;

    private static int refreshCnt = 0;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_simplexlist);

 

        geneItems();

 

        initClass();

 

        initControl();

 

        initXList();

 

    }

 

    private void geneItems() {

        for (int i = 0; i != 20; ++i) {

            items.add("refresh cnt " + (++start));

        }

    }

 

    private void initClass() {

        mHandler = new Handler();

    }

 

    private void initControl() {

        mListView = (XListView) findViewById(R.id.xListView_a);

        mAdapter = new ArrayAdapter<String>(this, R.layout.xlist_simpleitem,

                items);

    }

 

    private void initXList() {

        mListView.setPullLoadEnable(true);

        mListView.setPullRefreshEnable(true);

        mListView.setAdapter(mAdapter);

        mListView.setXListViewListener(this);

        mListView.setOnItemClickListener(new OnItemClickListener() {

 

            @Override

            public void onItemClick(AdapterView<?> parent, View view,

                    int position, long id) {

 

                Toast.makeText(getApplicationContext(), items.get(position),

                        Toast.LENGTH_SHORT).show();

            }

        });

        mListView.setOnItemSelectedListener(new OnItemSelectedListener() {

 

            @Override

            public void onItemSelected(AdapterView<?> parent, View view,

                    int position, long id) {

                Toast.makeText(getApplicationContext(), items.get(position),

                        Toast.LENGTH_SHORT).show();

            }

 

            @Override

            public void onNothingSelected(AdapterView<?> parent) {

            }

        });

    }

 

    private void onLoad() {

        mListView.stopRefresh();

        mListView.stopLoadMore();

        mListView.setRefreshTime("刚刚");

    }

 

    // Refresh

    @Override

    public void onRefresh() {

        mHandler.postDelayed(new Runnable() {

            @Override

            public void run() {

                start = ++refreshCnt;

                items.clear();

                geneItems();

                // mAdapter.notifyDataSetChanged();

                mAdapter = new ArrayAdapter<String>(SimpleXListActivity.this,

                        R.layout.xlist_simpleitem, items);

                mListView.setAdapter(mAdapter);

                onLoad();

            }

        }, 2000);

    }

 

    // LoadMore

    @Override

    public void onLoadMore() {

        mHandler.postDelayed(new Runnable() {

            @Override

            public void run() {

                geneItems();

                mAdapter.notifyDataSetChanged();

                onLoad();

            }

        }, 2000);

    }

}

演示 3:音乐列表 XListView


该演示只是在演示 2 的基础上,改变列表数据,简单起见,只访问一次网络,缓存在成员变量,“下拉更新”和“上拉加载”时循环利用。

图 5 演示 3

package com.example.listviewdemo.ui;

 

import org.json.JSONArray;

import org.json.JSONException;

 

import com.example.listviewdemo.R;

import com.example.listviewdemo.adapter.SimpleListAdapter;

import com.example.listviewdemo.dao.MusicDao;

import com.example.listviewdemo.widget.XListView;

import com.example.listviewdemo.widget.XListView.IXListViewListener;

 

import android.app.Activity;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.Handler;

import android.view.View;

import android.widget.AdapterView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.AdapterView.OnItemSelectedListener;

 

public class XListActivity extends Activity implements IXListViewListener {

 

    private XListView mListView;

    private SimpleListAdapter mAdapter;

    private JSONArray jsonArray;

    private JSONArray items;

    private MusicDao music;

 

    private Handler mHandler;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_xlist);

 

        initClass();

 

        initControl();

 

        initXList();

 

        new MyTask().execute(music);

    }

 

    private void initClass() {

        music = new MusicDao();

        mHandler = new Handler();

        items = new JSONArray();

    }

 

    private void initControl() {

        mListView = (XListView) findViewById(R.id.xListView_b);

    }

 

    private void initXList() {

        mListView.setPullLoadEnable(true);

        mListView.setPullRefreshEnable(true);

        mListView.setXListViewListener(this);

        mListView.setOnItemClickListener(new OnItemClickListener() {

 

            @Override

            public void onItemClick(AdapterView<?> parent, View view,

                    int position, long id) {

                try {

                    Toast.makeText(getApplicationContext(),

                            items.get(position).toString(), Toast.LENGTH_SHORT)

                            .show();

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

        });

        mListView.setOnItemSelectedListener(new OnItemSelectedListener() {

 

            @Override

            public void onItemSelected(AdapterView<?> parent, View view,

                    int position, long id) {

                try {

                    Toast.makeText(getApplicationContext(),

                            items.get(position).toString(), Toast.LENGTH_SHORT)

                            .show();

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

 

            @Override

            public void onNothingSelected(AdapterView<?> parent) {

            }

        });

    }

 

    private void onLoad() {

        mListView.stopRefresh();

        mListView.stopLoadMore();

        mListView.setRefreshTime("刚刚");

    }

 

    // Refresh

    @Override

    public void onRefresh() {

        mHandler.postDelayed(new Runnable() {

            @Override

            public void run() {

                for (int i = 9; i >= 0; i--) {

                    try {

                        items.put(jsonArray.get(i));

                    } catch (JSONException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }

                }

                // mAdapter.notifyDataSetChanged();

                mAdapter = new SimpleListAdapter(XListActivity.this, items);

                mListView.setAdapter(mAdapter);

                onLoad();

            }

        }, 2000);

    }

 

    // LoadMore

    @Override

    public void onLoadMore() {

        mHandler.postDelayed(new Runnable() {

            @Override

            public void run() {

                try {

                    for (int i = 0; i < 10; i++) {

                        items.put(jsonArray.get(i));

                    }

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

                mAdapter.notifyDataSetChanged();

                onLoad();

            }

        }, 2000);

    }

 

    public class MyTask extends AsyncTask<MusicDao, String, String> {

 

        private boolean mUseCache;

 

        public MyTask() {

            mUseCache = true;

        }

 

        public MyTask(boolean useCache) {

            mUseCache = useCache;

        }

 

        /* 鎵ц鍓嶏紝鐩稿叧椤甸潰澶勭悊 */

        @Override

        protected void onPreExecute() {

            super.onPreExecute();

        }

 

        /* 鎵ц涓� */

        @Override

        protected String doInBackground(MusicDao... params) {

            MusicDao dao = params[0];

            String result = dao.getData();

            return result;

        }

 

        @Override

        protected void onPostExecute(String result) {

            // TODO Auto-generated method stub

            super.onPostExecute(result);

            if (!result.isEmpty()) {

                try {

                    jsonArray = new JSONArray(result);

                    for (int i = 0; i < jsonArray.length(); i++) {

                        items.put(jsonArray.get(i));

                    }

 

                    mAdapter = new SimpleListAdapter(XListActivity.this, items);

                    mListView.setAdapter(mAdapter);

 

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

        }

    }

}

演示 4:另一个音乐列表 XListView


该演示是在演示 3 的基础上,“下拉更新”和“上拉加载”时都访问网络,重复利用数据。


但是,这个演示,在每次“下拉更新”和“上拉加载”时,都会调用 AsyncTask,不知道是否合适,不过 android 貌似不推荐这么做。

package com.example.listviewdemo.ui;

 

import org.json.JSONArray;

import org.json.JSONException;

 

import com.example.listviewdemo.R;

import com.example.listviewdemo.adapter.SimpleListAdapter;

import com.example.listviewdemo.dao.MusicDao;

import com.example.listviewdemo.widget.XListView;

import com.example.listviewdemo.widget.XListView.IXListViewListener;

 

import android.app.Activity;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.Handler;

import android.view.View;

import android.widget.AdapterView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.AdapterView.OnItemSelectedListener;

 

public class XListAnotherActivity extends Activity implements

        IXListViewListener {

 

    private XListView mListView;

    private SimpleListAdapter mAdapter;

    private JSONArray jsonArray;

    private JSONArray items;

    private MusicDao music;

 

    private Handler mHandler;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_xlistanother);

 

        initClass();

 

        initControl();

 

        initXList();

 

        new MyTask().execute(music);

    }

 

    private void initClass() {

        music = new MusicDao();

        mHandler = new Handler();

        items = new JSONArray();

    }

 

    private void initControl() {

        mListView = (XListView) findViewById(R.id.xListView_c);

        mAdapter = new SimpleListAdapter(XListAnotherActivity.this, items);

    }

 

    private void initXList() {

        mListView.setPullLoadEnable(true);

        mListView.setPullRefreshEnable(false);

        mListView.setXListViewListener(this);

        mListView.setAdapter(mAdapter);

        mListView.setOnItemClickListener(new OnItemClickListener() {

 

            @Override

            public void onItemClick(AdapterView<?> parent, View view,

                    int position, long id) {

                try {

                    Toast.makeText(getApplicationContext(),

                            items.get(position).toString(), Toast.LENGTH_SHORT)

                            .show();

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

        });

        mListView.setOnItemSelectedListener(new OnItemSelectedListener() {

 

            @Override

            public void onItemSelected(AdapterView<?> parent, View view,

                    int position, long id) {

                try {

                    Toast.makeText(getApplicationContext(),

                            items.get(position).toString(), Toast.LENGTH_SHORT)

                            .show();

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

 

            @Override

            public void onNothingSelected(AdapterView<?> parent) {

            }

        });

    }

 

    private void onLoad() {

        mListView.stopRefresh();

        mListView.stopLoadMore();

        mListView.setRefreshTime("刚刚");

    }

 

    // Refresh

    @Override

    public void onRefresh() {

        mHandler.postDelayed(new Runnable() {

            @Override

            public void run() {

                for (int i = 9; i >= 0; i--) {

                    try {

                        items.put(jsonArray.get(i));

                    } catch (JSONException e) {

                        // TODO Auto-generated catch block

                        e.printStackTrace();

                    }

                }

 

                new MyTask().execute(music);

                onLoad();

            }

        }, 2000);

    }

 

    // LoadMore

    @Override

    public void onLoadMore() {

        mHandler.postDelayed(new Runnable() {

            @Override

            public void run() {

                try {

                    for (int i = 0; i < 10; i++) {

                        items.put(jsonArray.get(i));

                    }

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

                // mAdapter.notifyDataSetChanged();

                new MyTask().execute(music);

                onLoad();

            }

        }, 2000);

    }

 

    public class MyTask extends AsyncTask<MusicDao, String, String> {

 

        private boolean mUseCache;

 

        public MyTask() {

            mUseCache = true;

        }

 

        public MyTask(boolean useCache) {

            mUseCache = useCache;

        }

 


        @Override

        protected void onPreExecute() {

            super.onPreExecute();

        }

 


        @Override

        protected String doInBackground(MusicDao... params) {

            MusicDao dao = params[0];

            String result = dao.getData();

            return result;

        }

 

        @Override

        protected void onPostExecute(String result) {

            // TODO Auto-generated method stub

            super.onPostExecute(result);

            if (!result.isEmpty()) {

                try {

                    jsonArray = new JSONArray(result);

                    jsonArray = new JSONArray(result);

                    for (int i = 0; i < jsonArray.length(); i++) {

                        items.put(jsonArray.get(i));

                    }

                    mAdapter.notifyDataSetChanged();

 

                } catch (JSONException e) {

                    // TODO Auto-generated catch block

                    e.printStackTrace();

                }

            }

        }

    }

}

最后,这四个演示都需要的 Adapter,如下所示:

package com.example.listviewdemo.adapter;

 

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

 

import com.example.listviewdemo.R;

import com.example.listviewdemo.utils.ImageLoader;

 

import android.app.Activity;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

 

public class SimpleListAdapter extends BaseAdapter {

 

    private Activity activity;

    private JSONArray data;

    private static LayoutInflater inflater = null;

    public ImageLoader imageLoader;

 

    public SimpleListAdapter(Activity a, JSONArray jsonArr) {

        activity = a;

        data = jsonArr;

        inflater = (LayoutInflater) activity

                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        imageLoader = new ImageLoader(activity.getApplicationContext());

        

    }

 

    public int getCount() {

        return data == null ? 0 : data.length();

    }

 

    public Object getItem(int position) {

        return position;

    }

 

    public long getItemId(int position) {

        return position;

    }

 

    public View getView(int position, View convertView, ViewGroup parent) {

        View vi = convertView;

        if (convertView == null)

            vi = inflater.inflate(R.layout.list_row, null);

 

        JSONObject song = null;

 

        ImageView image = (ImageView) vi.findViewById(R.id.imagethumb);

        TextView tvartist = (TextView) vi.findViewById(R.id.artist);

        TextView tvtitle = (TextView) vi.findViewById(R.id.title);

        TextView tvduration = (TextView) vi.findViewById(R.id.duration);

 

        try {

            song = data.getJSONObject(position);

            imageLoader.DisplayImage(song.getString("thumb_url"), image);

            tvartist.setText(song.getString("artist"));

            tvtitle.setText(song.getString("title"));

            tvduration.setText(song.getString("duration"));

        } catch (JSONException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

 

        return vi;

    }

}

Android github XListView 分析(2-3)

Android 演示 Android ListView 和 github XListView(3-3)

下载 Demo

Android 演示 Android ListView 和 github XListView(1-3)的更多相关文章

  1. Android 演示 Android ListView 和 github XListView(3-3)

    本文内容 环境 项目结构 演示 1:简单 XListView 演示 2:XListView + Fragment 演示 3:XListView + ViewPager + Fragment 本文三个演 ...

  2. Android github XListView 分析(2-3)

    本文内容 概述 XListView UML 图 下载 github XListView 概述 我们经常能见到 app 中的 listview 有"下拉更多"和"上拉加载& ...

  3. Android开发之ListView添加多种布局效果演示

    在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...

  4. android 很多牛叉布局github地址(转)

    原文地址 http://blog.csdn.net/luo15309823081/article/details/41449929 点击可到达github-------https://github.c ...

  5. Android—自定义控件实现ListView下拉刷新

    这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的 ...

  6. 实例演示Android异步加载图片

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  7. 实例演示Android异步加载图片(转)

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  8. Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  9. Android中实现ListView圆角效果[转]

    本文演示如何Android中实现ListView圆角效果. 无论是网站,还是APP,人们都爱看一些新颖的视图效果.直角看多了,就想看看圆角,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,特 ...

随机推荐

  1. VC 中 编译 boost 1.34.1 或者 1.34.0

    c++boost正则表达式的安装方法 (cy163已成功完成实验 基于宽字节 wstring 解决 "南日" 错误 匹配"12日" expression = & ...

  2. 关闭Delphi的RTTI

    {$IF CompilerVersion >= 21.0}{$WEAKLINKRTTI ON}{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS( ...

  3. 集合框架的类和接口均在java.util包中。 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。

    集合框架的类和接口均在java.util包中. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换.

  4. clientX, clientY,offsetX, offsetY,screenX, screenY, x, y

    clientX, clientY是鼠标当前相对于网页的位置,当鼠标位于页面左上角时clientX=0, clientY=0: offsetX, offsetY是鼠标当前相对于网页中的某一区域的位置,当 ...

  5. 关于面试总结5-python笔试题(递归)

    前言 本篇继续收集一些常见的python笔试题,以基础知识为主,递归是面试最喜欢考的一个问题,不管是做开发还是测试,都无法避免考递归.本篇结合实际案例,讲下几种关于递归的场景. 计算n的阶乘 计算n! ...

  6. Swift - 用CATransform3DMakeRotation实现翻页效果

    Swift - 用CATransform3DMakeRotation实现翻页效果 效果 源码 https://github.com/YouXianMing/Swift-Animations // // ...

  7. linux下生成https的crt和key证书

    今天在配置kibana权限设置时,kibana要求使用https链接. 于是总结了一下linux下openssl生成 签名的步骤: x509证书一般会用到三类文,key,csr,crt   Key 是 ...

  8. Java常用工具类之ArrayUtil

    过滤 ArrayUtil.filter方法用于编辑已有数组元素,只针对泛型数组操作,原始类型数组并未提供. 方法中Editor接口用于返回每个元素编辑后的值,返回null此元素将被抛弃. 例如:过滤数 ...

  9. Apache Jmeter 教程

    Jmeter是一款优秀的开源测试工具, 是每个资深测试工程师,必须掌握的测试工具,熟练使用Jmeter能大大提高工作效率. 熟练使用Jmeter后, 能用Jmeter搞定的事情,你就不会使用LoadR ...

  10. cross validation笔记

    preface:做实验少不了交叉验证,平时常用from sklearn.cross_validation import train_test_split,用train_test_split()函数将数 ...