gpt4 book ai didi

Android Listview 自定义部分标题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:44:40 24 4
gpt4 key购买 nike

我如何在 Android 中像 Instagram 应用一样实现 ListView 的自定义部分或标题。

http://prsarahevans.com/wp-content/uploads/2011/06/photo.PNG

当向上滚动带有用户图片的栏时,名称和时间仍然存在,当其他标题栏靠近它时,动画就像将它向上推一样。

谢谢。

最佳答案

我能够通过在 ListView 上使用滚动监听器来解决这个问题。 (在 2.1 上测试)

假设对于每个列表行,我都有一个如下所示的布局。有一个内容部分和一个标题部分。标题或内容使用什么 View 类型并不重要。

<?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>

Activity 的测试布局如下:

<?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>

最后, Activity 的代码如下。在这里,我必须有一个适配器,它使用 ViewHolder 来存储标题 View ,还有一个变量来跟踪每个连续滚动事件(previousTop)的滚动变化。这是因为 offsetTopAndBottom() 更改了与 View 的先前位置相关的 View 的偏移量。

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;
}
}

关于Android Listview 自定义部分标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9472507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com