Android程序开发之ListView实现横向滚动(带表头与固定列)

问题背景:在做图表展示的时候,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);
}
}
} 

以上所述是小编给大家介绍的Android程序开发之ListView实现横向滚动(带表头与固定列),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • android开发之横向滚动/竖向滚动的ListView(固定列头)

    由于项目需要,我们需要一个可以横向滚动的,又可以竖向滚动的 表格.而且又要考虑大数据量(行)的展示视图.经过几天的研究终于搞定,做了一个演示.贴图如下:      好吧.让我们看思路是什么样的: 1. 上下滚动直接使用 listView来实现. 2. 左右滚动使用HorizontalScrollView,来处理滚动.我写一个类MyHScrollView继承 自它. 2.1 . ListView里的每行(row)分为 两部分,不滚动的和可滚动的区域.比如本demo的第一列,就是静态的.而后面的所有

  • android ListView的右边滚动滑块启用方法 分享

    多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,这里Android开发网告诉大家,辅助滚动滑块只需要一行代码就可以搞定,如果你使用XML布局只需要在ListView节点中加入  android:fastScrollEnabled="true" 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏. 还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则

  • Android基于ListView实现类似QQ空间的滚动翻页与滚动加载效果

    本文实例讲述了Android基于ListView实现类似QQ空间的滚动翻页与滚动加载效果.分享给大家供大家参考,具体如下: 1. 滚动加载 listView.setOnScrollListener(new OnScrollListener() { //添加滚动条滚到最底部,加载余下的元素 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == OnScro

  • android listview 水平滚动和垂直滚动的小例子

    网上有很多解决 android listview 水平和垂直滚动的代码,我没有按照他们说的做(以前没搜到 O(∩_∩)O~) 我采用的是添加HorizontalScrollViewJava代码 复制代码 代码如下: < ScrollView android:id="@+id/ScrollView01" android:layout_height="300px" android:layout_x="16px" android:layout_y

  • Android编程实现ListView滚动提示等待框功能示例

    本文实例讲述了Android编程实现ListView滚动提示等待框功能.分享给大家供大家参考,具体如下: 其实原理很简单,只需要设置监听listview的滚动事件即可 file1: package cn.stay.activity; import java.util.ArrayList; import java.util.List; import com.aoran.R; import android.app.Activity; import android.os.Bundle; import

  • android ListView自动滚动方法

    复制代码 代码如下: <ListView android:id="listCWJ" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stackFromBottom="true" android:transcriptMode="alwaysScroll" />

  • Android开发ListView中下拉刷新上拉加载及带列的横向滚动实现方法

    ListView 控件可使用四种不同视图显示项目.通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本. 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:1.大(标准)图标2.小图标3.列表4.报表 View 属性决定在列表中控件使用何种视图显示项目. 还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示.另外,还可管理列表中项目的排序方法和选定项目的外观. 相信有很人做的项目估计都用的到这个.就是List

  • Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

    例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import COM.Example.Main.R; import COM.Example.Main.stringG

  • Android ListView滚动到底后自动加载数据

    熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们 今天就要讲一讲列表组件ListView加载数据的相关内容.通常来说,一个应用在展现大量数据时,不会将全部的可用数据都呈现给用户,因为这不管对于服 务端还是客户端来说都是不小的压力,因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.比如:微博客户端可能会在用户滑动至列表底端时自动加 载下一页数据,也可能在底部放置一个"加载更多"按钮,

  • Android简单记录和恢复ListView滚动位置的方法

    本文实例讲述了Android简单记录和恢复ListView滚动位置的方法.分享给大家供大家参考,具体如下: 有时候我们需要记录当前ListView滚动到的位置,重新加载的时候要回到原位,不罗嗦,给出代码: //列表滚动 private OnScrollListener ScrollLis = new OnScrollListener() { @Override public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3)

  • Android ListView滚动到指定的位置

    本文介绍的关于ListView移动到指定位置有两种方法,下面话不多说,直接来看示例代码: listview.setSelection(position); listview.smoothScrollToPosition(position); 第一种方法没有滚动效果,直接跳到指定位置,第二种方法是有滚动效果的. 但是,在是用的时候,你会发现第二种方法没有效果,甚至都没有移动,其实这个问题很好解决,只要在新线程里是用就可以了 listview.post(new Runnable() { @Overr

随机推荐