Tôi đã sử dụng (hoặc đúng hơn, đã cố gắng sử dụng) thư viện StickyListHeaders
trước đây. Sau khi có một số vấn đề với nó, tôi đã đưa ra những điều sau đây. Nó không khác nhiều so với những gì áp phích khác đã gợi ý.
Tệp bố cục chính activity_layout.xml
bao gồm ListView
và LinearLayout
được ẩn theo mặc định. Sử dụng phương thức onScrollListener của onScroll(), khả năng hiển thị LinearLayout's
được bật. Bạn không cần thổi phồng một bố cục khác hoặc thêm chế độ xem động vào bố mẹ của bố cục. Đây là phương thức của onScroll
trông giống như:
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem > 3) { // 5th row will stick
llHeader.setVisibility(View.VISIBLE);
} else {
llHeader.setVisibility(View.GONE);
}
}
Đơn giản chỉ cần bật/tắt chế độ hiển thị để đạt được hiệu quả mong muốn. Bạn có thể xem mã sau đây. Đó là một ví dụ làm việc về những gì bạn có thể mong đợi. Hoạt động có chứa một ListView
với phần mở rộng nghiêm ngặt là BaseAdapter
. ListView
được điền bằng các nút được đánh số (một trên mỗi hàng, bắt đầu từ 0 và lên đến 19).
public class StickyHeader extends Activity {
LinearLayout llHeader;
ListView lv;
SHAdapter shAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
lv = (ListView) findViewById(R.id.listView1);
llHeader = (LinearLayout) findViewById(R.id.llHeader);
shAdapter = new SHAdapter();
lv.setAdapter(shAdapter);
lv.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem > 3) {
llHeader.setVisibility(View.VISIBLE);
} else {
llHeader.setVisibility(View.GONE);
}
}
});
}
public class SHAdapter extends BaseAdapter {
Button btCurrent;
int[] arr = new int[] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
@Override
public int getCount() {
return 20;
}
@Override
public Object getItem(int arg0) {
return arr[arg0];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = getLayoutInflater().inflate(R.layout.list_item_layout, null);
btCurrent = (Button) convertView.findViewById(R.id.button1);
if ((Integer)getItem(position) == 4) {
btCurrent.setText("Number " + getItem(position) + " is sticky");
} else {
btCurrent.setText("" + getItem(position));
}
return convertView;
}
}
}
activity_layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
<!-- This LinearLayout's visibility is toggled -->
<!-- Improvement suggested by user 'ar34z'
(see comment section below) -->
<include layout="@layout/list_item_layout" />
</RelativeLayout>
list_item_layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llHeader"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Tôi chỉ tìm thấy thư viện này: https://github.com/emilsjolander/StickyListHeaders, vì vậy tôi sẽ cố gắng điều này bây giờ, và sau đó thêm câu trả lời bản thân mình nếu nó hoạt động tốt. – minhee
Tôi thấy StickyListHeaders không phù hợp với công việc của tôi, vì vậy tôi đã cập nhật câu hỏi. – minhee