參考文章:http://blog.csdn.net/tyk0910/article/details/52066891
效果圖如下:
先說佈局:一個RelativeLayout裏面一個listview 再在listview上面放一個textview 重合
item裏面分2個item,一個紅色的textview 一個顯示內容的textview
listview數據方面:(這方面處理的不夠好,數據有點多個人覺得)
總共3個list數組:
private List<String> listdate;//這個數組是存放的數據 比如上圖的ABCD 嘀嘀7 這種的 private List<String> listdate1;//這個數組是存放的ABCD 把上面那個數組裏面的AB這種數據分離出來方面後面設置頂部textview的數據 private List<Boolean> listbool;//這個就是存放一組布爾值,方便listview中有2中類型的item
下面看具體代碼:
首先是數據方面:
//開始A listdate.add("A"); listdate1.add("A"); listbool.add(true); for (int i = 0; i < 10; i++) { listdate.add("啊啊" + i); listbool.add(false); listdate1.add("A"); } //開始A listdate.add("B"); listdate1.add("B"); listbool.add(true); for (int i = 0; i < 10; i++) { listdate.add("寶寶" + i); listbool.add(false); listdate1.add("B"); }
規則就是:3個數組的大小一樣,存布爾值得數組就是爲了listview該放哪種item,date1數組就是爲了可以根據當前的item的postion得到頭部textview 該是A還是B 又後者是C。這些可以根據實際情況改變的相應的規則,只要能實現額外的數組能實現的功能的就行。
下面是適配器:主要就是放佈局,並且給每一個子view設置一個tag,2個作用:1、可以在佈局的時候重用子view,viewholder這裏就懶的寫了因爲要寫2個。2.在listview滑動的時候可以判斷headtext是否要移動
@Override public View getView(int position, View convertView, ViewGroup parent) { String s = listdate.get(position); boolean aBoolean = listbool.get(position); if (aBoolean) {//暫停部分的佈局 if (convertView == null || !(boolean) convertView.getTag()) { convertView = LayoutInflater.from(ZanTingActivity.this).inflate(R.layout .item001, null); } TextView headtext = (TextView) convertView.findViewById(R.id.headtext); headtext.setText(s); convertView.setTag(true); } else {//內容部分的佈局 if (convertView == null || (boolean) convertView.getTag()) { convertView = LayoutInflater.from(ZanTingActivity.this).inflate(R.layout .item002, null); } TextView headtext = (TextView) convertView.findViewById(R.id.conttext); headtext.setText(s); convertView.setTag(false); } return convertView; }下面就只有一點listview滑動的代碼了:
listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { Log.i("sss",firstVisibleItem+""); childAt = null; headtext.setText(listdate1.get(firstVisibleItem)); x = view.pointToPosition(headtext.getWidth() / 2, headtext.getBottom() + 1); childAt = view.getChildAt(x - firstVisibleItem); if (childAt != null && (boolean) childAt.getTag()) { headtext.setTranslationY(childAt.getTop() - headtext.getBottom()); } else if (childAt != null && !(boolean) childAt.getTag()) { headtext.setTranslationY(0); } } });很簡單吧。childAt 是子view。x是代表headtext下面的第一個子view的postion。就是根據這個子view判斷該不該移動headtext。
大概就這幾個部分就可以實現上圖效果。思路就是這樣,當然參考文章中使用RecyclerView實現,誰叫我listview用的熟,所以用listview寫了個,關鍵的是思路。剩下的就得根據具體的需求來改了。