안 드 로 이 드 밴드 group 지시기 의 ExpandableListView(자체 작성)

우 리 는 안 드 로 이 드 가 부족 한 ExpandableListView 의 group header 가 인터페이스 에 고정 되 지 않 는 다 는 것 을 알 고 있 습 니 다.아래로 스크롤 한 후에 현재 표 시 된 child 에 대해 어느 group 에 속 하 는 지 지시 할 수 없습니다.인터넷 에서 모 바 일 QQ 친구 의 조별 효과 에 관 한 ExpandableListView 를 많이 찾 아 보 았 는데 모두 뜻 대로 되 지 않 아서 다른 사람 을 바탕 으로 조금 개선 되 었 습 니 다.사실 원 리 는 차이 가 많 지 않 습 니 다.위로 밀어 내 는 애니메이션 효 과 를 추 가 했 을 뿐 더욱 간단 합 니 다.다만 QQ 와 같은 효과 에 완전히 도달 하지 못 했 습 니 다.고수 가 더욱 실 감 나 는 효 과 를 실현 하 기 를 바 랍 니 다.다음 에 효과 도 를 살 펴 보 겠 습 니 다. 저 는 ExpandableListView 를 독립 시 켜 새로운 컨트롤 을 만 들 지 않 았 습 니 다.인터넷 에 있 는 많은 친구 들 과 마찬가지 로 OnScrollListener 사건 을 감청 합 니 다.group 이 첫 번 째 위치 에 있 지 않 을 때 우리 머리 에 있 는 indicator 를 표시 하고 view 를 현재 child 가 있 는 group 의 view 와 똑 같이 한 다음 에 그룹 을 닫 는 이 벤트 를 추가 합 니 다.즉,QQ 친구 그룹 을 간단하게 모방 하 는 효과 가 있 습 니 다.다음은 주요 레이아웃 파일 을 살 펴 보 겠 습 니 다:main.xml,아래 top Group 의 FrameLayout 가 바로 우리 의 표시 기 입 니 다.
 
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ExpandableListView
android:id="@+id/expandableListView"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ExpandableListView>
<FrameLayout
android:id="@+id/topGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</FrameLayout>
</FrameLayout>
그 중에서 가장 중요 한 것 은 다음 과 같은 부분 이다.우 리 는 onSroll 이라는 인터페이스 사건 을 감청 하고 ListView 가 미 끄 러 질 때 해당 하 는 처 리 를 한다.코드 에 주석 이 비교적 많 기 때문에 나 는 설명 을 많이 하지 않 는 다.
 
/**
* here is very importance for indicator group
*/
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
final ExpandableListView listView = (ExpandableListView) view;
/**
* calculate point (0,0)
*/
int npos = view.pointToPosition(0, 0);// firstVisibleItem
if (npos == AdapterView.INVALID_POSITION)//
return;
long pos = listView.getExpandableListPosition(npos);
int childPos = ExpandableListView.getPackedPositionChild(pos);// child id
int groupPos = ExpandableListView.getPackedPositionGroup(pos);// group id
if (childPos == AdapterView.INVALID_POSITION) {// child, group,
View groupView = listView.getChildAt(npos
- listView.getFirstVisiblePosition());// view
indicatorGroupHeight = groupView.getHeight();// group
indicatorGroup.setVisibility(View.GONE);//
} else {
indicatorGroup.setVisibility(View.VISIBLE);// child,
}
// get an error data, so return now
if (indicatorGroupHeight == 0) {
return;
}
// update the data of indicator group view
if (groupPos != indicatorGroupId) {// group
mAdapter.getGroupView(groupPos, listView.isGroupExpanded(groupPos),
indicatorGroup.getChildAt(0), null);// group
indicatorGroupId = groupPos;
Log.e(TAG, PRE + "bind to new group,group position = " + groupPos);
// mAdapter.hideGroup(indicatorGroupId); // we set this group view
// to be hided
//
indicatorGroup.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
listView.collapseGroup(indicatorGroupId);
}
});
}
if (indicatorGroupId == -1) // grop id ,
return;
/**
* calculate point (0,indicatorGroupHeight)
*/
int showHeight = indicatorGroupHeight;
int nEndPos = listView.pointToPosition(0, indicatorGroupHeight);// item
if (nEndPos == AdapterView.INVALID_POSITION)//
return;
long pos2 = listView.getExpandableListPosition(nEndPos);
int groupPos2 = ExpandableListView.getPackedPositionGroup(pos2);// group id
if (groupPos2 != indicatorGroupId) {// group
View viewNext = listView.getChildAt(nEndPos
- listView.getFirstVisiblePosition());
showHeight = viewNext.getTop();
Log.e(TAG, PRE + "update the show part height of indicator group:"
+ showHeight);
}
// update group position
MarginLayoutParams layoutParams = (MarginLayoutParams) indicatorGroup
.getLayoutParams();
layoutParams.topMargin = -(indicatorGroupHeight - showHeight);
indicatorGroup.setLayoutParams(layoutParams);
}
본문 원본 코드 다운로드마지막 으로 아이 폰 주소록 효 과 를 모방 한 또 다른 코드 를 공유 하 겠 습 니 다.이것 은 ListView 의 확장 으로 효과 가 가장 좋다.ExpandableListView 를 같은 효과 로 확장 할 수 있 는 고수 가 있 기 를 바 랍 니 다.원본 코드 다운로드

좋은 웹페이지 즐겨찾기