本文内容

  • 环境
  • 项目结构
  • 演示 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. mmc生产任务分配问题续

    mmc生产任务分配问题续,本题目比上个题目难, 要注意的是,生产,销售,库存的关系, 生产+上月库存-销售=本月库存, 期初,生产=库存,销售没有.

  2. SQLCE使用本地数据库优化

    一.数据绑定 1.使用数据虚拟化和SKIP/TAKE 使用 Skip 和 Take 方法可确保直到需要在 ListBox 控件中显示数据时才将数据库中的数据加载到内存中. 例如,以下代码显示了如何从数 ...

  3. 使用Coding4Fun工具包

    Coding4Fun是一款很受WP开发者喜爱的开源类库,对于开发者来说,Coding4Fun上手很简单.只要从CodePlex下载Coding4Fun工具包,下载完成后,解压文件到一个文件夹中,里面有 ...

  4. A股和B股票的区别?

    一.A股和B股的区别——概念不同 (一).A股的概念A股是由中国境内的公司发行,正式名称是人民币普通股票,供境内机构.组织或个人(从4月1日起,境内港.澳.台居民可开立A股账户)以人民币认购和交易的普 ...

  5. Javascript 身份证号获得出生日期、获得性别、检查身份证号码

    //---------------------------------------------------------- // 功能:根据身份证号获得出生日期 // 参数:身份证号 psidno // ...

  6. Android_开源框架_AndroidUniversalImageLoader网络图片加载

    1.功能概要 Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示. (1).使用多线程加载图片(2) ...

  7. Netbeans 安装emmet插件

    一.下载插件 http://plugins.netbeans.org/plugin/48315/emmet 二.点击工具-> 插件 -> 已下载 -> 添加插件 ->(导入下载 ...

  8. Android倒计时功能的实现

    Android中的倒计时的功能(也能够直接使用CountDownTimer这个类直接实现,相关此Demo可查看我的博客).參考了网上写的非常好的一个倒计时Demo: watermark/2/text/ ...

  9. 暗影猎人第一二季/全集Shadowhunters迅雷下载

    <暗影猎人>该剧根据小说<致命契约>(The Mortal Instruments)改编,是电影<圣杯神器:骸骨之城>的续篇.故事描述少女Clary Fray(Ka ...

  10. Material Designer的低版本兼容实现(九)—— Float Button & Small Float Button

    5.0一个新特性就是出现了这么一个圆形的悬浮指示按钮,这个按钮可以用来体现一个全局的重要功能,比如添加账户什么的.这个按钮有两种大小,一种是正常的按钮大小,一种是小型的按钮.官方文档中介绍的是小心的按 ...