基本思路:
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; } }); } }
<?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>
效果图:
布局示意图