您的位置:首页 > 其它

ListView的横向滚动(带表头与固定列)

2015-05-20 20:57 323 查看
问题背景:在做图表展示的时候,ListView可以上下左右滑动,但最左边一列在向右滑动时,保持不变,表头在向下滑动时保持不变。

有用两个ListView实现的,但测试过,好像有些问题

这个例子是通过(ListView + HorizontalScrollView)实现的

效果图:



Activity代码代码







/**
*
* 带滑动表头与固定列的ListView
*/
public class HListActivity extends Activity{
private ListView mListView;
//方便测试,直接写的public
public HorizontalScrollView mTouchView;
//装入所有的HScrollView
protected List<CHScrollView> mHScrollViews =new ArrayList<CHScrollView>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scroll);
initViews();
}

private void initViews() {
List<Map<String, String>> datas = new ArrayList<Map<String,String>>();
Map<String, String> data = null;
CHScrollView headerScroll = (CHScrollView) findViewById(R.id.item_scroll_title);
//添加头滑动事件
mHScrollViews.add(headerScroll);
mListView = (ListView) findViewById(R.id.scroll_list);
for(int i = 0; i < 100; i++) {
data = new HashMap<String, String>();
data.put("title", "Title_" + i);
data.put("data_" + 1, "Date_" + 1 + "_" +i );

data.put("data_" + 2, "Date_" + 2 + "_" +i );

data.put("data_" + 3, "Date_" + 3 + "_" +i );

data.put("data_" + 4, "Date_" + 4 + "_" +i );

data.put("data_" + 5, "Date_" + 5 + "_" +i );

data.put("data_" + 6, "Date_" + 6 + "_" +i );

datas.add(data);
}
SimpleAdapter adapter = new ScrollAdapter(this, datas, R.layout.item
, new String[] { "title", "data_1", "data_2", "data_3", "data_4", "data_5", "data_6", }

, new int[] { R.id.item_title
, R.id.item_data1
, R.id.item_data2
, R.id.item_data3
, R.id.item_data4
, R.id.item_data5
, R.id.item_data6 });
mListView.setAdapter(adapter);
}

public void addHViews(final CHScrollView hScrollView) {
if(!mHScrollViews.isEmpty()) {
int size = mHScrollViews.size();
CHScrollView scrollView = mHScrollViews.get(size - 1);
final int scrollX = scrollView.getScrollX();
//第一次满屏后,向下滑动,有一条数据在开始时未加入
if(scrollX != 0) {
mListView.post(new Runnable() {
@Override
public void run() {
//当listView刷新完成之后,把该条移动到最终位置
hScrollView.scrollTo(scrollX, 0);
}
});
}
}
mHScrollViews.add(hScrollView);
}

public void onScrollChanged(int l, int t, int oldl, int oldt){
for(CHScrollView scrollView : mHScrollViews) {
//防止重复滑动
if(mTouchView != scrollView)
scrollView.smoothScrollTo(l, t);
}
}

class ScrollAdapter extends SimpleAdapter {

private List<? extends Map<String, ?>> datas;
private int res;
private String[] from;
private int[] to;
private Context context;
public ScrollAdapter(Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
this.context = context;
this.datas = data;
this.res = resource;
this.from = from;
this.to = to;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if(v == null) {
v = LayoutInflater.from(context).inflate(res, null);
//第一次初始化的时候装进来
addHViews((CHScrollView) v.findViewById(R.id.item_scroll));
View[] views = new View[to.length];
for(int i = 0; i < to.length; i++) {
View tv = v.findViewById(to[i]);;
tv.setOnClickListener(clickListener);
views[i] = tv;
}
v.setTag(views);
}
View[] holders = (View[]) v.getTag();
int len = holders.length;
for(int i = 0 ; i < len; i++) {
((TextView)holders[i]).setText(this.datas.get(position).get(from[i]).toString());
}
return v;
}
}

//测试点击的事件
protected View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(HListActivity.this, ((TextView)v).getText(), Toast.LENGTH_SHORT).show();
}
};
}

滑动view代码







/**
* 滑动代码
*/
public class CHScrollView extends HorizontalScrollView {

HListActivity activity;

public CHScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
activity = (HListActivity) context;
}

public CHScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
activity = (HListActivity) context;
}

public CHScrollView(Context context) {
super(context);
activity = (HListActivity) context;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
//进行触摸赋值
activity.mTouchView = this;
return super.onTouchEvent(ev);
}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
//当当前的CHSCrollView被触摸时,滑动其它
if(activity.mTouchView == this) {
activity.onScrollChanged(l, t, oldl, oldt);
}else{
super.onScrollChanged(l, t, oldl, oldt);
}
}
}

ListScroll.rar (146.4 KB)
下载次数: 613
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: