Tôi có thể giải quyết vấn đề này bằng cách sử dụng trình xử lý cuộn trên chế độ xem danh sách. (được thử nghiệm trên 2.1)
Cho phép nói cho mỗi hàng trong danh sách, tôi có bố cục như hình bên dưới. Có một phần nội dung và phần tiêu đề. Việc bạn sử dụng loại xem nào cho tiêu đề hoặc nội dung không quan trọng.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" android:background="#FFFFFF">
<ImageView
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:scaleType="centerCrop"
android:src="@drawable/pic"
android:background="#aaaaff"
android:layout_marginTop="40dp"/>
<TextView
android:id="@+id/header"
android:layout_width="fill_parent"
android:layout_height="40dp"
android:padding="12dp"
android:text="Deneme Row"
android:textColor="#000000"
android:background="#99ffffff"/>
</RelativeLayout>
Cách bố trí thử nghiệm cho hoạt động này là như sau đây:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
</LinearLayout>
Cuối cùng mã cho hoạt động này được đưa ra dưới đây. Ở đây tôi đã có một bộ điều hợp sử dụng ViewHolder để lưu trữ chế độ xem tiêu đề và cũng là một biến để theo dõi thay đổi trong cuộn cho mỗi sự kiện cuộn liên tiếp (previousTop). Điều này là do thực tế offsetTopAndBottom() thay đổi độ lệch của khung nhìn liên quan đến vị trí trước đó của nó.
public class TestActivity extends Activity implements AbsListView.OnScrollListener{
ListView list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list = (ListView) findViewById(R.id.list);
list.setAdapter(new Adapter(this));
list.setOnScrollListener(this);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//the listview has only few children (of course according to the height of each child) who are visible
for(int i=0; i < list.getChildCount(); i++){
View child = list.getChildAt(i);
ViewHolder holder = (ViewHolder) child.getTag();
//if the view is the first item at the top we will do some processing
if(i == 0){
boolean isAtBottom = child.getHeight() <= holder.header.getBottom();
int offset = holder.previousTop - child.getTop();
if(!(isAtBottom && offset > 0)){
holder.previousTop = child.getTop();
holder.header.offsetTopAndBottom(offset);
holder.header.invalidate();
}
} //if the view is not the first item it "may" need some correction because of view re-use
else if (holder.header.getTop() != 0) {
int offset = -1 * holder.header.getTop();
holder.header.offsetTopAndBottom(offset);
holder.previousTop = 0;
holder.header.invalidate();
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}
private static class Adapter extends ArrayAdapter<String> {
public Adapter(Context context) {
super(context, R.layout.row, R.id.header);
for(int i=0; i < 50; i++){
add(Integer.toString(i));
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row, parent, false);
ViewHolder holder = new ViewHolder();
holder.header = (TextView) convertView.findViewById(R.id.header);
convertView.setTag(holder);
}
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.header.setText(getItem(position));
return convertView;
}
}
private static class ViewHolder {
TextView header;
int previousTop = 0;
}
}
Hey siyamed, này là rất hữu ích. Trong trường hợp của tôi, tôi có thêm một ListView (con) bên trong ListView (Parent). do đó tiêu đề không hoạt động đúng khi tôi đang cuộn xuống .... – ashish2py
Nếu không có dữ liệu trong chế độ xem danh sách trẻ em, thì nó hoạt động bình thường .. > ứng dụng mẫu https://bitbucket.org/ashish2py/instagramheader – ashish2py
Tôi sẽ thử. Cám ơn! –