基本思路:
ListView外面嵌套FrameLayout,把要浮动的布局包裹在另一个FrameLayout中,同时包裹一个用于占坑的textview。
监听listview滚动事件,监听到要浮动显示的控件变成listview中最上面的控件后,除去该控件,加到listview外面包裹的FrameLayout中,
当监听到要浮动显示的控件的上面一个变成listview中最上面的控件后,从listview外面的Fragment中除去浮动的控件,加到listview中占坑的textview所在的FrameLayout中
代码
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final FrameLayout listViewContainer=new FrameLayout(getApplicationContext());
final ListView listView=new ListView(getApplicationContext());
listViewContainer.addView(listView);
setContentView(listViewContainer);
listView.setDivider(new ColorDrawable(Color.BLACK));
listView.setDividerHeight(2);
listView.setOnScrollListener(new OnScrollListener() {
int lastPosi=-1;
//是否在悬浮
boolean isFloating;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
//当滚动时即使firstVisibleItem依旧是某一个但该方法可能会调用多次,加个lastPosi标记一下
if (lastPosi!=firstVisibleItem) {
lastPosi=firstVisibleItem;
System.out.println(firstVisibleItem);
//isFloating ==false表示没有浮动展示
//浮动的是第二个
if (isFloating==false&&firstVisibleItem==1) {
//vg就是getView中inflat的布局
//由于要浮动显示的控件所在的父布局已经变成了listview中第一个,所以使用listView.getChildAt(0)取出
ViewGroup vg=(ViewGroup) listView.getChildAt(0);
//vg是个FrameLayout,child(0)是占坑的textview (详见item。xml布局)
//child(1)才是要浮动的布局
View floatView=vg.getChildAt(1);
//从ListView、中移除要浮动的布局前应先设置占坑的textview的高度,负责移除要浮动的控件后listview会突然往上滚动一段距离
View textView=vg.getChildAt(0);
textView.getLayoutParams().height=floatView.getHeight();
vg.removeViewAt(1);
//把要浮动显示的控件加入到FrameLayout中
listViewContainer.addView(floatView);
isFloating=true;
}
//当往下滚,直到出现第一个时,要把浮动的控件放回原来的listview中
if (isFloating&&firstVisibleItem==0) {
View floatView =listViewContainer.getChildAt(1);
listViewContainer.removeViewAt(1);
//由于第一个已经出现,所以占坑textview所在的位置变成了第2个
ViewGroup vg=(ViewGroup) listView.getChildAt(1);
vg.addView(floatView);
isFloating=false;
}
}
}
});
listView.setAdapter(new BaseAdapter() {
//两种类型的控件
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
@Override
public int getItemViewType(int position) {
//只有第二个位置的控件才需要浮动显示
if (position==1) {
return 1;
}
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
int type=getItemViewType(position);
//需要浮动显示的布局
if (type==1) {
ViewGroup vg;
if (convertView==null) {
vg=(ViewGroup) LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
View but=((ViewGroup)vg.getChildAt(1)).getChildAt(0);
but.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "click 好友", 0).show();
}
});
}else{
vg=(ViewGroup) convertView;
}
return vg;
}else{
//不需要浮动显示的普通布局
TextView tv;
if (convertView==null) {
tv=new TextView(getApplicationContext());
tv.setTextColor(Color.BLACK);
tv.setTextSize(55);
tv.setPadding(20, 30, 30, 20);
}else
tv=(TextView) convertView;
tv.setText(""+position);
return tv;
}
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 500;
}
});
}
}
item.xml
<?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="wrap_content"
>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#000"
android:text="占个坑"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#888"
>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:text="好友"
android:textColor="#000"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:text="消息"
android:textColor="#000"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:text="朋友圈"
android:textColor="#000"/>
</LinearLayout>
</FrameLayout>
效果图:
布局示意图