先看效果,其实实现起来的逻辑并不难:
大概的逻辑就是给listview添加两个headview,并且将listview的父布局设置为帧布局,隐藏好一个需要一直显示在头部的标题栏,当firstVisibleItem>=1的时候,显示出那个隐藏好的标题栏即可。
先来看看布局文件,这是第一个头布局headview1:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:background="#302015"></LinearLayout> </LinearLayout>这是第二个头布局headview2:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:scaleType="fitXY" android:src="@drawable/qq"/> </LinearLayout>这是主布局,在帧布局中隐藏了一个emptyimg和一个要显示的标题栏:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.listviewtest.MainActivity" > <FrameLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" > </ListView> <LinearLayout android:id="@+id/invis" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:visibility="gone" > <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/qq" android:scaleType="fitXY" /> </LinearLayout> <ImageView android:id="@+id/enpty_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/radio_big_hubble" /> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:orientation="horizontal" android:layout_weight="2"> <Button android:id="@+id/button1" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="1" android:text="clear" /> <Button android:id="@+id/button2" android:layout_marginLeft="10dp" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="1" android:text="reset" /> </LinearLayout> </LinearLayout>
package com.example.listviewtest; import java.text.SimpleDateFormat; import java.util.ArrayList; import android.support.v7.app.ActionBarActivity; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.graphics.Canvas; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.animation.RotateAnimation; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; public class MainActivity extends ActionBarActivity implements android.view.View.OnClickListener{ private ListView mListView; private Button clearBtn; private Button resetBtn; private ListViewAdapter mAdapter; private ArrayList<String> mList; private float mFirstY; private float mSecondY; private float mCurrentY; private int mTouchSlop; private int direction; private LinearLayout invis; private View headview1; private View headview2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getData(); setContentView(R.layout.activity_main); UintUI(); } private void UintUI() { mListView=(ListView) this.findViewById(R.id.listView1); clearBtn=(Button)this.findViewById(R.id.button1); resetBtn=(Button)this.findViewById(R.id.button2); invis=(LinearLayout)this.findViewById(R.id.invis); clearBtn.setOnClickListener(this); resetBtn.setOnClickListener(this); mListView.setEmptyView(findViewById(R.id.enpty_img)); //设置当适配器为空的时候的图片 mAdapter=new ListViewAdapter(mList,MainActivity.this); mListView.setAdapter(mAdapter); headview1=View.inflate(this, R.layout.headview, null); mListView.addHeaderView(headview1); //添加头文件1 headview2=View.inflate(this, R.layout.headview2, null); mListView.addHeaderView(headview2);//添加头文件2 SimpleDateFormat sdf=new SimpleDateFormat("yy-MM-dd HH:mm:ss"); //时间格式 sdf.format(System.currentTimeMillis()); mTouchSlop=ViewConfiguration.get(this).getScaledTouchSlop(); mListView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch(event.getAction()){ case MotionEvent.ACTION_DOWN: mFirstY=event.getY(); break; case MotionEvent.ACTION_UP: mSecondY=event.getY(); break; case MotionEvent.ACTION_MOVE: mCurrentY=event.getY(); if((mCurrentY-mFirstY)>mTouchSlop){ direction=0;//down } else if((mCurrentY-mFirstY)<mTouchSlop){ direction=1;//up } if (direction==1) { }else if(direction==0){ } break; } return false; } }); mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(firstVisibleItem>=1){ //当第一个headview消失的时候,显示的其实不是第二个headview,而是长相和它一样的一个图片 invis.setVisibility(View.VISIBLE); } else{ invis.setVisibility(View.GONE); } } }); } public ArrayList<String> getData(){ mList=new ArrayList<String>(); for (int i=0;i<15;i++){ mList.add("this is No:"+i); } return mList; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.button1: mList.clear(); mListView.removeHeaderView(headview1); mListView.removeHeaderView(headview2); Log.e("list size","is"+ mList.size()); mAdapter.notifyDataSetChanged(); break; case R.id.button2: getData(); Log.e("list is", mList.get(5)); UintUI(); mAdapter.notifyDataSetChanged(); mListView.setAdapter(mAdapter); break; } } }
为listview添加适配器:
package com.example.listviewtest; import java.util.ArrayList; import android.annotation.SuppressLint; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class ListViewAdapter extends BaseAdapter { @Override public int getItemViewType(int position) { return super.getItemViewType(position); } @Override public int getViewTypeCount() { return super.getViewTypeCount(); } private ArrayList<String> list; private Context context; public ListViewAdapter(ArrayList<String> mList , Context context){ this.list=mList; this.context=context; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View view=LayoutInflater.from(context).inflate(R.layout.item, null); TextView mTextView=(TextView)view.findViewById(R.id.item_text); mTextView.setText(list.get(position)); return view; } public class ViewHolder{ public TextView mText; } }