listview 簡單實現頂部暫停效果

參考文章: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寫了個,關鍵的是思路。剩下的就得根據具體的需求來改了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章