ListView浮动某以条目


基本思路:

    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>

效果图:

    



布局示意图



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值