Android程序開發(fā)之ListView實現(xiàn)橫向滾動(帶表頭與固定列)
問題背景:在做圖表展示的時候,ListView可以上下左右滑動,但最左邊一列在向右滑動時,保持不變,表頭在向下滑動時保持不變。
有用兩個ListView實現(xiàn)的,但測試過,好像有些問題
這個例子是通過(ListView + HorizontalScrollView)實現(xiàn)的
效果圖:

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();
//第一次滿屏后,向下滑動,有一條數(shù)據(jù)在開始時未加入
if(scrollX != 0) {
mListView.post(new Runnable() {
@Override
public void run() {
//當(dāng)listView刷新完成之后,把該條移動到最終位置
hScrollView.scrollTo(scrollX, 0);
}
});
}
}
mHScrollViews.add(hScrollView);
}
public void onScrollChanged(int l, int t, int oldl, int oldt){
for(CHScrollView scrollView : mHScrollViews) {
//防止重復(fù)滑動
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);
//第一次初始化的時候裝進(jìn)來
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;
}
}
//測試點(diǎn)擊的事件
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) {
//進(jìn)行觸摸賦值
activity.mTouchView = this;
return super.onTouchEvent(ev);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
//當(dāng)當(dāng)前的CHSCrollView被觸摸時,滑動其它
if(activity.mTouchView == this) {
activity.onScrollChanged(l, t, oldl, oldt);
}else{
super.onScrollChanged(l, t, oldl, oldt);
}
}
}
以上所述是小編給大家介紹的Android程序開發(fā)之ListView實現(xiàn)橫向滾動(帶表頭與固定列),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- android開發(fā)之橫向滾動/豎向滾動的ListView(固定列頭)
- 詳解Android使GridView橫向水平滾動的實現(xiàn)方式
- Android使用GridView實現(xiàn)橫向滾動效果
- Android開發(fā)實現(xiàn)橫向列表GridView橫向滾動的方法【附源碼下載】
- Android GridView實現(xiàn)橫向列表水平滾動
- Android自定義ViewGroup實現(xiàn)可滾動的橫向布局(2)
- Android實現(xiàn)自定義的彈幕效果
- 實例解析如何在Android應(yīng)用中實現(xiàn)彈幕動畫效果
- Android 實現(xiàn)仿網(wǎng)絡(luò)直播彈幕功能詳解及實例
- Android實現(xiàn)橫向無限循環(huán)滾動的單行彈幕效果
相關(guān)文章
Android中實現(xiàn)淘寶購物車RecyclerView或LIstView的嵌套選擇的邏輯
這篇文章主要介紹了Android中實現(xiàn)淘寶購物車RecyclerView或LIstView的嵌套選擇的邏輯,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12
Android實現(xiàn)復(fù)制Assets文件到SD卡
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)復(fù)制Assets文件到SD卡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Flutter加載圖片流程MultiFrameImageStreamCompleter解析
這篇文章主要為大家介紹了Flutter加載圖片流程MultiFrameImageStreamCompleter示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Android-Jetpack-Navigation組件使用示例
這篇文章主要介紹了Android-Jetpack-Navigation組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
C#中利用正則表達(dá)式將人民幣金額轉(zhuǎn)換為大寫漢字
這篇文章主要介紹了C#中利用正則表達(dá)式將人民幣金額轉(zhuǎn)換為大寫漢字的方法,需要的朋友可以參考下2016-02-02
Android中ContentProvider和ContentResolver詳解
這篇文章主要介紹了Android中ContentProvider和ContentResolver詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
微信或手機(jī)瀏覽器在線顯示office文件(已測試ios、android)
這篇文章主要介紹了微信或手機(jī)瀏覽器在線顯示office文件,已測試ios、android,感興趣的小伙伴們可以參考一下2016-06-06
Android RecyclerView實現(xiàn)點(diǎn)擊條目刪除
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView實現(xiàn)點(diǎn)擊條目刪除,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11
Android中使用IntentService創(chuàng)建后臺服務(wù)實例
這篇文章主要介紹了Android中使用IntentService創(chuàng)建后臺服務(wù)實例,IntentService提供了在單個后臺線程運(yùn)行操作的簡單結(jié)構(gòu),需要的朋友可以參考下2014-06-06

