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; } } //測試點擊的事件 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)文章
使用androidx BiometricPrompt實現(xiàn)指紋驗證功能
這篇文章主要介紹了使用androidx BiometricPrompt實現(xiàn)指紋驗證功能,對android指紋驗證相關(guān)知識感興趣的朋友跟隨小編一起看看吧2021-07-07Android 線程thread的兩種實現(xiàn)方法(必看)
下面小編就為大家?guī)硪黄狝ndroid 線程thread的兩種實現(xiàn)方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Android中BroadcastReceiver實現(xiàn)短信關(guān)鍵字自動回復(fù)功能
實現(xiàn)手機(jī)短信監(jiān)聽的方式有兩種:一是通過ContentObserver觀察者實現(xiàn)監(jiān)聽,另一種就是通過廣播即BroadcastReceiver實現(xiàn)短信監(jiān)聽,文章中通過使用BroadcastReceiver實現(xiàn)有新短信的及時監(jiān)聽及包含設(shè)定的關(guān)鍵字時自動回復(fù)2018-06-06Android Studio配合WampServer完成本地Web服務(wù)器訪問的問題
這篇文章主要介紹了Android Studio配合WampServer完成本地Web服務(wù)器訪問,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10