您的位置:首页 > 其它

使用listview绘制表格,实现双击表头排序

2015-09-21 12:19 405 查看
最近做一个项目要用到表格,思来想去,还是用了listview。

首先,在项目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项的数据。

如果大家有什么好的方法能实现单击排序,可以相互交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: