本文内容

  • 环境
  • 项目结构
  • 演示 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. Android:intent的基础

    只有一个活动的应用也太简单了吧?没错,你的追求应该更高一点.不管你想创建多少 个活动,方法都和上一节中介绍的是一样的.唯一的问题在于,你在启动器中点击应用的图 标只会进入到该应用的主活动,那么怎样才能 ...

  2. IOS 内存斗争小史之 对象、指针、内存的基本理解

    1.指针和对象,都是内存块.一个大,一个小.一个在栈中,一个在堆中. 2.iOS中,我们可以生命一个指针,也可以通过alloc获取一块内存. 3.我们可以直接消灭掉一个指针,将其置为nil.但是我们没 ...

  3. 同志亦凡人第五季/全集BQueer As Folk 5迅雷下载

    同志亦凡人 第五季 Queer as Folk Season 5 (2005) 本季看点:这是一群生活在匹兹堡男人和男人,女人和女人的故事.在他们的王国里有各色人物.王国的国王Brian(葛尔?哈罗德 ...

  4. ADO与ADO.Net

    在介绍ADO.Net之前先让我们回想一下在红皮书中学习的ADO的内容. ADO(ActiveX Data Objects).我们称它为一种用于数据訪问的对象模型,<VB.Net>视频中称它 ...

  5. 《HTML5与CSS3基础教程(第8版)》

    <HTML5与CSS3基础教程(第8版)> 基本信息 原书名:HTML and CSS:visual quickstart guide 作者: (美)Elizabeth Castro    ...

  6. Orchard模块开发全接触6:自定义用户注册

    我们都知道 Orchard 的用户注册相当简单,现在,我们需要一个自定义的用户注册,现在,开始吧. 一:定义实体 Models/CustomerPartRecord.cs: public class ...

  7. MySQL 锁模式

    InnoDB implements standard row-level locking where there are two types of locks, shared (S) locks an ...

  8. sql server获取标识,获取最后ID IDENT_CURRENT、IDENTITY、SCOPE_IDENTITY区别

    概念解释 IDENT_CURRENT returns the last identity value generated for a specific table in any session and ...

  9. mysql 触发器 插入

    MySQL触发器 重要学习资料: http://dev.mysql.com/doc/refman/5.1/zh/triggers.html 在使用触发器的时候,遇到一个错误: [SQL]insert ...

  10. emouse思·睿—评论与观点整理之五

    虽说我主要做的硬件,平时的兴趣爱好比较关注移动互联网,混迹于虎嗅.爱范儿.雷锋网.36Kr.cnBeta.瘾科技.i黑马.TechWeb等这类科技以及创业媒体,遗憾的是系统的去写的并不多,好在还算充分 ...