如图所示效果,列表+手势分页
java代码:
- private final static String TAG = AlarmCenterActivity.class.getName();
- private ScrollLayout mScrollLayout;
- private List<SpinnerItem> agentList = new ArrayList<SpinnerItem>();
- private Spinner sp_agent;// 主机下拉框
- private EditText ealarm_name;// 实例名称
- private Button serach_btn;// 搜索按钮
- private ScrollPageControlView pageControl;
- public MyHandler myHandler;
- private DataLoading dataLoad;
- List<Map> list = new ArrayList<Map>();//web端获取的数据
- // 存放下拉选中的值
- String tmpAgent = "";// 主机
- // 告警中心列表
- final String ALARM_URL = "xxxxxx";
- // 主机下拉
- final String AGENT_URL = "xxxxxxxxxx";
- // 查询条件--主机名称
- String s_agent_name = "";
- // 查询条件--实例名称
- String s_alarm_name = "";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_alarmcenter);
- initUI();
- Toast.makeText(AlarmCenterActivity.this, "正在加载数据...", Toast.LENGTH_SHORT).show();
- //起一个线程更新数据
- MyThread m = new MyThread();
- new Thread(m).start();
- }
- // 获取组件初始化值
- private void initUI() {
- dataLoad = new DataLoading();
- mScrollLayout = (ScrollLayout) findViewById(R.id.ScrollLayoutTest);
- myHandler = new MyHandler(this, 1);
- sp_agent = (Spinner) findViewById(R.id.sp_agent);
- ealarm_name = (EditText) findViewById(R.id.Ealarm_name);
- serach_btn = (Button) findViewById(R.id.search);
- // 主机下拉数据来源
- List<NameValuePair> params = new ArrayList<NameValuePair>();
- params.add(new BasicNameValuePair("id", "agent_id"));
- params.add(new BasicNameValuePair("name", "agent_name"));
- try {
- String strAgents = HttpIface.doPost(AGENT_URL, params);
- JSONObject json = new JSONObject(strAgents);
- Iterator<String> it = json.keys();
- SpinnerItem spinnerItem;
- String key;
- // 默认全部
- SpinnerItem add_spinnerItem = new SpinnerItem("", "全部");
- agentList.add(add_spinnerItem);
- while (it.hasNext()) {
- key = it.next();
- spinnerItem = new SpinnerItem(key, (String) json.get(key));
- agentList.add(spinnerItem);
- }
- } catch (JSONException e) {
- Log.e(TAG, "json convert error!");
- e.printStackTrace();
- } catch (ClientProtocolException e) {
- Log.e(TAG, "HttpIface.doPost ClientProtocolException");
- e.printStackTrace();
- } catch (IOException e) {
- String message = "";
- if (message.indexOf("The operation timed out") > -1){
- message = "调用服务超时!";
- } else {
- message = "调用服务出现网络异常!";
- }
- DialogUtil.displayError(AlarmCenterActivity.this, message, new OnClickListener() {
- @Override
- public void onClick(View v) {
- }
- });
- Log.e(TAG, "调用服务超时或出现网络异常:" + ExceptionHandler.getErrorMessage(e));
- }
- /**
- * 下拉框处理
- */
- // 将可选内容与ArrayAdapter连接
- ArrayAdapter s_agent_adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, agentList);
- // 设置下拉列表的风格
- s_agent_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- // 将s_agent_adapter添加到sp_agent中
- sp_agent.setAdapter(s_agent_adapter);
- // 添加主机下拉框Spinner事件监听
- sp_agent.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> arg0, View arg1,
- int arg2, long arg3) {
- tmpAgent = agentList.get(arg2).getKey();
- // 设置显示当前选择的项
- arg0.setVisibility(View.VISIBLE);
- }
- @Override
- public void onNothingSelected(AdapterView<?> arg0) {
- arg0.setVisibility(View.VISIBLE);
- }
- });
- // 查询按钮的事件监听
- serach_btn.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v) {
- s_alarm_name = ealarm_name.getText().toString();
- s_agent_name = tmpAgent;
- mScrollLayout.removeAllViews();
- //重新加载
- list.clear();
- getListData();
- int totalPages = 0;
- if ((list.size() % AlarmCenterAdapter.APP_PAGE_SIZE) == 0) {
- totalPages = list.size() / AlarmCenterAdapter.APP_PAGE_SIZE;
- } else {
- totalPages = list.size() / AlarmCenterAdapter.APP_PAGE_SIZE + 1;
- }
- for (int i = 0; i < totalPages; i++) {
- ListView appPage = new ListView(AlarmCenterActivity.this);
- appPage.setAdapter(new AlarmCenterAdapter(AlarmCenterActivity.this, list, i));
- appPage.setOnItemClickListener(listener);
- mScrollLayout.addView(appPage);
- }
- // 加载分页
- pageControl = (ScrollPageControlView) findViewById(R.id.pageControl);
- pageControl.bindScrollViewGroup(mScrollLayout);
- // 加载分页数据
- dataLoad.bindScrollViewGroup(mScrollLayout);
- mScrollLayout.snapToScreen(0);
- }
- });
- }
- // 更新后台数据
- class MyThread implements Runnable {
- public void run() {
- Message msg = myHandler.obtainMessage();
- Bundle bundle = new Bundle();// 存放数据
- getListData();
- JSONArray ja = new JSONArray(list);
- bundle.putString("alarmList", ja.toString());
- msg.setData(bundle);
- AlarmCenterActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
- }
- }
- //获取数据
- class MyHandler extends Handler {
- private AlarmCenterActivity mContext;
- public MyHandler(Context conn, int a) {
- mContext = (AlarmCenterActivity) conn;
- }
- // 子类必须重写此方法,接收数据
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- Bundle bundle = msg.getData();
- String alarmList = bundle.getString("alarmList");
- if (null != alarmList) {
- int totalPages = 0;
- if ((list.size() % AlarmCenterAdapter.APP_PAGE_SIZE) == 0) {
- totalPages = list.size() / AlarmCenterAdapter.APP_PAGE_SIZE;
- } else {
- totalPages = list.size() / AlarmCenterAdapter.APP_PAGE_SIZE + 1;
- }
- for (int i = 0; i < totalPages; i++) {
- ListView appPage = new ListView(mContext);
- appPage.setAdapter(new AlarmCenterAdapter(mContext, list, i));
- appPage.setOnItemClickListener(listener);
- mScrollLayout.addView(appPage);
- }
- // 加载分页
- pageControl = (ScrollPageControlView) findViewById(R.id.pageControl);
- pageControl.bindScrollViewGroup(mScrollLayout);
- // 加载分页数据
- dataLoad.bindScrollViewGroup(mScrollLayout);
- }
- }
- }
- // 从服务器获取数据并转换
- public void getListData() {
- Map<String, String> map = null;
- String strResult = HttpIface.doGet(ALARM_URL);
- if (!"".equals(strResult) && null != strResult) {
- JSONTokener jsonParser = new JSONTokener(strResult);
- JSONObject jsonObject;
- try {
- jsonObject = (JSONObject) jsonParser.nextValue();
- String prgjson = jsonObject.getString("alarmCur");
- JSONArray jsonArray = new JSONArray(prgjson);
- for (int i = 0; i < jsonArray.length(); i++) { //
- JSONObject item = jsonArray.getJSONObject(i); // 每条记录又由几个Object对象组成
- String kpi_instance_id = item.getString("KPI_INSTANCE_ID"); // 获取对象对应的值
- String agent_name = item.getString("AGENT_NAME");// 主机
- 。。。。。。
- //查询条件全部不为空
- if (!s_agent_name.equals("") && !s_alarm_name.equals("")) {
- if (agent_name.equals(s_agent_name) && kpi_instance_name.trim().indexOf(s_alarm_name) != -1) {
- map = new HashMap<String, String>(); // 存放到MAP里面
- map.put("kpi_instance_id", kpi_instance_id);
- map.put("agent_name", agent_name);
- 。。。。。。
- list.add(map);
- }
- }
- // 按程序名称查询
- if (s_agent_name.equals("") && !s_alarm_name.equals("")) {
- if (kpi_instance_name.trim().indexOf(s_alarm_name) != -1) {
- map = new HashMap<String, String>(); // 存放到MAP里面
- map.put("kpi_instance_id", kpi_instance_id);
- map.put("agent_name", agent_name);
- 。。。。。。
- list.add(map);
- }
- }
- // 按主机名称模糊查询
- if (!s_agent_name.equals("") && s_alarm_name.equals("")) {
- if (agent_name.equals(s_agent_name)) {
- map = new HashMap<String, String>(); // 存放到MAP里面
- map.put("kpi_instance_id", kpi_instance_id);
- map.put("agent_name", agent_name);
- 。。。。。。
- list.add(map);
- }
- }
- // 查询全部
- if (s_agent_name.equals("") && s_alarm_name.equals("")) {
- map = new HashMap<String, String>(); // 存放到MAP里面
- map.put("kpi_instance_id", kpi_instance_id);
- map.put("agent_name", agent_name);
- 。。。。。。。
- map.put("user_id_c", user_id_c);
- list.add(map);
- }
- }
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- }
- // 分页数据
- class DataLoading {
- private int count;
- public void bindScrollViewGroup(ScrollLayout scrollViewGroup) {
- this.count = scrollViewGroup.getChildCount();
- scrollViewGroup.setOnScreenChangeListenerDataLoad(new OnScreenChangeListenerDataLoad() {
- public void onScreenChange(int currentIndex) {
- Log.i(TAG, "onScreenChange 页码 = " + currentIndex);
- generatePageControl(currentIndex);
- }
- });
- }
- private void generatePageControl(int currentIndex) {
- if (count == currentIndex + 1) {
- }
- }
- }
//列表展示给各列赋值
- //获取组件赋值
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- Map appInfo = mList.get(position);
- AppItem appItem;
- if (convertView == null) {
- View v = LayoutInflater.from(mContext).inflate(R.layout.item_alarmcenter, null);
- appItem = new AppItem();
- appItem.num = (TextView) v.findViewById(R.id.num);
- appItem.agent_name = (TextView) v.findViewById(R.id.agent_name);
- 。。。。。。。。
- v.setTag(appItem);
- convertView = v;
- } else {
- appItem = (AppItem)convertView.getTag();
- }
- //赋值
- appItem.num.setText(position+1+"");
- appItem.agent_name.setText(appInfo.get("agent_name") == null ? "":appInfo.get("agent_name").toString());
- appItem.coll_value.setText(appInfo.get("coll_value") == null ? "":appInfo.get("coll_value").toString());
- appItem.kpi_instance_name.setText(appInfo.get("kpi_instance_name") == null ? "":appInfo.get("kpi_instance_name").toString());
- 。 。。。。。
- return convertView;
- }
查询组件和列表表头的XML list_alarmcenter.xml
- <!-- 查询条件 -->
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal" >
- <LinearLayout
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="9"
- android:background="@drawable/sys_btn_query_pressed"
- android:gravity="center_vertical|left"
- android:orientation="horizontal" >
- <TextView
- android:id="@+id/txtagent"
- style="@style/label_text"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:text="主机:" />
- <Spinner
- android:id="@+id/sp_agent"
- style="@style/edit_text"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="2"
- android:gravity="left" />
- </LinearLayout>
- <Button
- android:id="@+id/search"
- style="@style/button"
- android:layout_width="0dip"
- android:layout_marginLeft="20dip"
- android:layout_weight="1" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="5dip"
- android:orientation="vertical" >
- <!-- 标题 -->
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@drawable/page_title_bg" >
- <View style="@style/vertical_layout" />
- <TextView
- android:id="@+id/alarm_num"
- android:layout_width="70dp"
- android:layout_height="wrap_content"
- android:gravity="center_vertical|center_horizontal"
- android:padding="10dp"
- android:singleLine="true"
- android:text="序号"
- android:textColor="#000000"
- android:textSize="16dp"
- android:textStyle="bold" />
- <View style="@style/vertical_layout" />
- <TextView
- android:id="@+id/textView1"
- android:layout_width="160dp"
- android:layout_height="wrap_content"
- android:gravity="center_vertical|center_horizontal"
- android:padding="10dp"
- android:singleLine="true"
- android:text="主机"
- android:textColor="#000000"
- android:textSize="16dp"
- android:textStyle="bold" />
- <View style="@style/vertical_layout" />
- 。。。。。。。。
- </LinearLayout>
// 给列表赋值组件 item_alarmcenter.xml
- <LinearLayout
- android:id="@+id/view"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="horizontal" >
- <View style="@style/vertical_layout" />
- <!-- 序号 -->
- <TextView
- android:id="@+id/num"
- android:layout_width="70dp"
- android:layout_height="wrap_content"
- android:gravity="center_vertical|center_horizontal"
- android:padding="10dp"
- android:singleLine="true"
- android:textColor="#000000"
- android:textSize="16dp" />
- <View style="@style/vertical_layout" />
- <!-- 主机 -->
- <TextView
- android:id="@+id/agent_name"
- android:layout_width="160dp"
- android:layout_height="wrap_content"
- android:gravity="center_vertical|center_horizontal"
- android:padding="10dp"
- android:singleLine="true"
- android:textColor="#000000"
- android:textSize="16dp" />
- <View style="@style/vertical_layout" />
- 。。。。。。。。
- </LinearLayout>
//滑动组件ScrollLayout scroll_page_main.xml
- <RelativeLayout
- android:id="@+id/myView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- <com.sunrise.common.component.ScrollLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/ScrollLayoutTest"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" />
- <com.sunrise.common.component.ScrollPageControlView
- android:id="@+id/pageControl"
- android:layout_width="fill_parent"
- android:layout_height="40px"
- android:layout_alignParentBottom="true"
- android:gravity="center" />
- </RelativeLayout>
以上俩个xml 文件 分别引入到总的 xml 文件中。
- <include layout="@layout/list_alarmcenter" />
- <include layout="@layout/scroll_page_main" />
列表展示详解:
listView开始绘制的时候,首先调用getCount()函数,根据他的返回值得到listView的长度,然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。
getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的 item_alarmcenter.xml 文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那 再绘制下一行,直到绘完为止。
手势滑动:
1. 该类和LinearLayout、RelativeLayout等布局都是ViewGroup的子类。LinearLayout可以在属性中指定view的排列方式——横向或纵向,而我们自己写的这个类是通过onLayout(boolean changed, int l, int t, int r, int b)方法来自行指定排列方向的。我们这里指定的是横向。
2. 该类中用到了一些我们不常用的类,如VelocityTracker和Scroller,大家可以参考Android开发文档研究一下。