使用listview绘制表格,实现双击表头排序
2015-09-21 12:19
405 查看
最近做一个项目要用到表格,思来想去,还是用了listview。
首先,在项目style.xml中添加如下代码:
两种style分别为横线和竖线。
接下来是activity_main布局:
如果要绘制的表格列比较多,显示不下。可以在listview外面嵌套一个HorizontalScrollView。
listview的item布局:
布局完成后,开始看java代码,首先是MainActivity
MyAdapter.java:
MainActivity中的UpComparator,UpComparator2,DownComparator,DownComparator2是4个工具类,其中Up是升序排列,Down是降序排列。
因为列表item里有两项,所以要两个工具类。(我目前没什么好办法把工具类整合,如果谁有好办法,欢迎分享)
UpComparator.java
其他3个工具类代码差不多就不贴了。
下面附运行效果图:
目前,我的水平只能实现双击排序,因为listview设置了setOnItemClickListener,首先要触发listview的OnItemClick事件,然后
才会触发textview的OnClick事件,而如果是在adapter里设置textview的OnClick事件虽然可以做到单击响应,但却不能更新全部数据
,只能更新所点item项的数据。
如果大家有什么好的方法能实现单击排序,可以相互交流。
首先,在项目style.xml中添加如下代码:
<style name="vertical_layout"> <item name="android:layout_width">1dp</item> <item name="android:layout_height">match_parent</item> <item name="android:background">@drawable/vertical_divider</item> </style> <style name="horizontal_layout"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">1dp</item> <item name="android:background">@drawable/horizontal_divider</item> </style>
两种style分别为横线和竖线。
接下来是activity_main布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/gray" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/gray" android:orientation="vertical" > <View style="@style/horizontal_layout"/> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="50dp" android:cacheColorHint="#00000000" /> <View style="@style/horizontal_layout"/> </LinearLayout> </LinearLayout>
如果要绘制的表格列比较多,显示不下。可以在listview外面嵌套一个HorizontalScrollView。
listview的item布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/white" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <View style="@style/vertical_layout"/> <TextView android:id="@+id/tv1" android:layout_width="150dp" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="16sp" android:gravity="center_vertical|center_horizontal" android:padding="10dp" android:singleLine="true" /> <View style="@style/vertical_layout"/> <TextView android:id="@+id/tv2" android:layout_width="220dp" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="16sp" android:gravity="center_vertical|center_horizontal" android:padding="10dp" android:singleLine="true" /> <View style="@style/vertical_layout"/> </LinearLayout> <View style="@style/horizontal_layout"/> </LinearLayout>
布局完成后,开始看java代码,首先是MainActivity
package com.example.table; import java.util.ArrayList; import java.util.Collections; import com.example.table.util.DownComparator; import com.example.table.util.DownComparator2; import com.example.table.util.UpComparator; import com.example.table.util.UpComparator2; import android.os.Bundle; import android.app.Activity; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; public class MainActivity extends Activity { private ListView lv; private MyAdapter adapter; private ArrayList<ArrayList<String>> lists = new ArrayList<ArrayList<String>>(); private boolean flag=true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); String arr1[] = {"名次","1","2","3","4"}; String arr[] = {"姓名","A","B","C","D"}; for(int i = 0;i < arr.length;i++){ ArrayList<String> list=new ArrayList<String>(); list.add(arr[i]); list.add(arr1[i]); lists.add(list); } adapter = new MyAdapter(MainActivity.this, lists); lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(final AdapterView<?> parent, View view, int position, long id) { if(position == 0){ final ArrayList<String> list = (ArrayList<String>) parent.getAdapter().getItem(0); final ArrayList<ArrayList<String>> lists =new ArrayList<ArrayList<String>>(); final ArrayList<ArrayList<String>> lists1 =new ArrayList<ArrayList<String>>(); TextView tv1 = (TextView) lv.getChildAt(0).findViewById(R.id.tv1); TextView tv2 = (TextView) lv.getChildAt(0).findViewById(R.id.tv2); tv1.setOnClickListener(new OnClickListener() { public void onClick(View v) {
//设置一个标识flag,执行不同的点击事件 if(flag){ flag = false; for(int i = 1;i<parent.getAdapter().getCount();i++){ ArrayList<String> list1 = (ArrayList<String>) parent.getAdapter().getItem(i); lists.add(list1); } //UpComparator是一个升序排列的工具类 UpComparator comp=new UpComparator(); Collections.sort(lists,comp); lists1.add(list); for(int i = 0;i<lists.size();i++){ lists1.add(lists.get(i)); } adapter = new MyAdapter(MainActivity.this,lists1); lv.setAdapter(adapter); } else{ flag = true; for(int i = 1;i<parent.getAdapter().getCount();i++){ ArrayList<String> list1 = (ArrayList<String>) parent.getAdapter().getItem(i); lists.add(list1); } DownComparator comp=new DownComparator(); Collections.sort(lists,comp); lists1.add(list); for(int i = 0;i<lists.size();i++){ lists1.add(lists.get(i)); } adapter = new MyAdapter(MainActivity.this,lists1); lv.setAdapter(adapter); } } }); tv2.setOnClickListener(new OnClickListener() { public void onClick(View v) { if(flag){ flag = false; for(int i = 1;i<parent.getAdapter().getCount();i++){ ArrayList<String> list1 = (ArrayList<String>) parent.getAdapter().getItem(i); lists.add(list1); } UpComparator2 comp=new UpComparator2(); Collections.sort(lists,comp); lists1.add(list); for(int i = 0;i<lists.size();i++){ lists1.add(lists.get(i)); } adapter = new MyAdapter(MainActivity.this,lists1); lv.setAdapter(adapter); } else{ flag = true; for(int i = 1;i<parent.getAdapter().getCount();i++){ ArrayList<String> list1 = (ArrayList<String>) parent.getAdapter().getItem(i); lists.add(list1); } DownComparator2 comp=new DownComparator2(); Collections.sort(lists,comp); lists1.add(list); for(int i = 0;i<lists.size();i++){ lists1.add(lists.get(i)); } adapter = new MyAdapter(MainActivity.this,lists1); lv.setAdapter(adapter); } } }); } } }); } }
MyAdapter.java:
package com.example.table; import java.util.ArrayList; import java.util.Collections; import com.example.table.util.DownComparator; import com.example.table.util.UpComparator; import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.BaseAdapter; import android.widget.TextView; import android.widget.Toast; public class MyAdapter extends BaseAdapter { private Context context; private LayoutInflater inflater; private ArrayList<ArrayList<String>> lists; public MyAdapter(Context context, ArrayList<ArrayList<String>> lists) { super(); this.context = context; this.lists = lists; inflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return lists.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return lists.get(position); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(final int position, View view, ViewGroup arg2) { // TODO Auto-generated method stub if(view == null){ view = inflater.inflate(R.layout.item, null); } view.setBackgroundColor(Color.WHITE); final TextView tv1 = (TextView) view.findViewById(R.id.tv1); final TextView tv2 = (TextView) view.findViewById(R.id.tv2); tv1.setTextColor(Color.BLACK); tv1.setText(lists.get(position).get(0)); tv2.setText(lists.get(position).get(1)); if(position == 0){ view.setBackgroundResource(R.color.head_bg); tv1.setTextColor(Color.WHITE); tv2.setTextColor(Color.WHITE); }else{ view.setBackgroundColor(Color.argb(250 , 255 , 255 , 255 )); } return view; } }
MainActivity中的UpComparator,UpComparator2,DownComparator,DownComparator2是4个工具类,其中Up是升序排列,Down是降序排列。
因为列表item里有两项,所以要两个工具类。(我目前没什么好办法把工具类整合,如果谁有好办法,欢迎分享)
UpComparator.java
package com.example.table.util; import java.util.ArrayList; import java.util.Comparator; public class UpComparator implements Comparator<ArrayList<String>> { @Override public int compare(ArrayList<String> l1, ArrayList<String> l2) { String s1 = (String) l1.get(0); String s2 = (String) l2.get(0); if(s1.compareTo(s2)>0){ return 1; } else if(s1.compareTo(s2)==0){ return 0; } else return -1; } }
其他3个工具类代码差不多就不贴了。
下面附运行效果图:
目前,我的水平只能实现双击排序,因为listview设置了setOnItemClickListener,首先要触发listview的OnItemClick事件,然后
才会触发textview的OnClick事件,而如果是在adapter里设置textview的OnClick事件虽然可以做到单击响应,但却不能更新全部数据
,只能更新所点item项的数据。
如果大家有什么好的方法能实现单击排序,可以相互交流。
相关文章推荐
- android 获取textView的行数为0,获取控件的宽高为0的解决办法
- 华丽的网上突出代码组件CodeMirror
- js之DOM操作(插入节点insertBefore())
- Redis学习笔记
- jsp中的<%=表达式%>和<%表达式%>有什么区别?
- InnoSetup 如何获取安装程序的路径?
- [LeetCode] Peeking Iterator
- Android发送xml数据给服务器的方法
- Powershell DSC 5.0 - Push 模式
- 两步搞定Activity的向右滑动返回的功能
- xamarin ios KeyBoardHide
- 自动引用技术
- 【APP测试初体验】android测试命令----压力测试
- 用Jersey构建RESTful服务4--通过jersey-client客户端调用Jersey的Web服务模拟CURD
- 弱问JSP中的<%= %>和${ }到底有什么区别?
- 【Java基金会】Java整理面试问题和评论(一)
- Linux经常使用的命令(21) - find参数具体解释
- 如何申请iOS开发者证书/发布app到手机
- 定位 - CoreLocation - 打印位置信息
- Java中的static关键字解析