首页 > 代码库 > 介绍ListView中的几种位置关系和LayoutAnimation在listview中的应用

介绍ListView中的几种位置关系和LayoutAnimation在listview中的应用

ListView的属性:

1.ListView的XML属性
android:divider//在列表条目之间显示的drawable或color

android:dividerHeight//用来指定divider的高度

android:entries//构成ListView的数组资源的引用。对于某些固定的资源,这个属性提供了比在程序中添加资源更加简便的方式

android:footerDividersEnabled//当设为false时,ListView将不会在各个footer之间绘制divider.默认为true。

android:headerDividersEnabled//当设为false时,ListView将不会在各个header之间绘制divider.默认为true。
  2.继承自AbsListView的XML属性

android:cacheColorHint// 表明这个列表的背景始终以单一、固定的颜色绘制,可以优化绘制过程。

android:choiceMode//为视图指定选择的行为。可选的类型有:none、singleChoice、multipleChoice、multipleChoiceModal。

android:drawSelectorOnTop// 若设为true,选择器将绘制在选中条目的上层。默认为false。

android:faseScrollEnabled// 设置是否允许使用快速滚动滑块。

android:listSelector// 设置选中项显示的可绘制对象,可以是图片或者颜色属性。

android:scrollingCache// 设置在滚动时是否使用绘制缓存。若设为true,则将使滚动表现更快速,但会占用更内存。默认为true。

android:smoothScrollbar// 为真时,列表会使用更精确的基于条目在屏幕上的可见像素高度的计算方法。默认该属性为真,如果你的适配器需要绘制可变高的条目,他应该设为假。当该属性为真时,你在适配器在显示变高条目时,滚动条的把手会在滚动的过程中改变大小。当设为假时,列表只使用适配器中的条目数和屏幕上的可见条目来决定滚动条的属性。

android:stackFromBottom// 设置GridView和ListView是否将内容从底部开始显示。

android:textFilterEnabled// 当设为真时,列表会将结果过滤为用户类型。前提是这个列表的Adapter必须支持Filterable接口。

android:transcriptMode//设置列表的transcriptMode.有如下选项可选:
//(1)disabled          禁用TranscriptMode,也是默认值;
//(2)normal             当新条目添加进列表中并且已经准备好显示的时候,列表会自动滑动到底部以显示最新条目;
//(3)alwaysScroll   列表会自动滑动到底部,无论新条目是否已经准备好显示.

一个例子:

<ListView
        android:layout_below="@id/btn"
        android:id="@+id/draggable_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginBottom="5dip"
        android:cacheColorHint="#f4f4f4"
        android:fadingEdge="none"
        android:listSelector="#f4f4f4"
        android:paddingLeft="16dip"
        android:paddingRight="16dip"
        android:transcriptMode="alwaysScroll"
        android:layoutAnimation="@anim/layout_bottom_to_top_slide" />


layout_bottom_to_top_slide

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
        android:delay="30%"
        android:animation="@anim/slide_right" />
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
            android:duration="@android:integer/config_shortAnimTime" />
</set>

一个小例子说明listview的item的位置关系:

public class MainActivity extends Activity {

	private ArrayList<String> myList = new ArrayList<String>();
	private ArrayAdapter<String> myAdapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		final ListView list = (ListView) findViewById(R.id.draggable_list);
		
		myList.add("11");
		myList.add("22");
		myList.add("33");
		myList.add("44");
		myList.add("55");
		myList.add("66");
		myList.add("77");
	
		myAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, myList);
		LayoutInflater inflater = LayoutInflater.from(this);
		TextView header = (TextView)inflater.inflate(R.layout.header, null);
		TextView footer = (TextView)inflater.inflate(R.layout.footer, null);

		list.addFooterView(footer);
		list.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				
				float x = event.getX();
				float y = event.getY();
				print(list,x,y);
				return false;
			}
		});
		list.addHeaderView(header);
		
		list.setAdapter(myAdapter);
		Button btn = (Button)findViewById(R.id.btn);
		btn.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				myList.add("88");
				myList.add("99");
				myList.add("aa");
				myAdapter.notifyDataSetChanged();
				
			}
		});
		
		
	}

	
	private void print(final ListView list,final float pointerX,float pointerY) {
		int firstVisiblePosition = list.getFirstVisiblePosition();  //在当前这一屏上的第一个listview的item的序号,包涵header,从0开始计算
		int lastVisiblePosition = list.getLastVisiblePosition();   //在当前这一屏上最后一个listview的item的序号,包含header和footer,从0开始计算

		int maxItemPosition = list.getCount() - list.getFooterViewsCount() - 1; // 这个不把footer view算进去 ,list.getCount()会把header和footer都算进去
		int minItemPosition = list.getHeaderViewsCount();
		 //这里的beginViewIndex指的是在这一个屏幕上显示的第一个list的item(不包含headerview)
		int beginViewIndex = (firstVisiblePosition > minItemPosition ? firstVisiblePosition : minItemPosition) - firstVisiblePosition;
		//这里的endViewIndex不包含footer view,不能通过adapter.getItem得到的不算
		int endViewIndex = (lastVisiblePosition < maxItemPosition ? lastVisiblePosition : maxItemPosition) - firstVisiblePosition;
		
		//这个是点击的view在当前屏幕的序号,从0开始计算
		int pointeredViewIndex = list.pointToPosition((int) pointerX, (int) pointerY) - firstVisiblePosition;

		
	  //这个是点击的view在当前屏幕的序号,从0开始计算,可以通过listview.getChild(pointeredViewIndex)得到这个item
       <span style="white-space:pre">	</span>        int pointeredItemPosition = pointeredViewIndex + firstVisiblePosition - minItemPosition;
        
		System.out.println("====firstVisiblePosition="+firstVisiblePosition+"lastVisiblePosition="+lastVisiblePosition);
		System.out.println("====beginViewIndex="+beginViewIndex+"endViewIndex="+endViewIndex+"maxItemPosition="+maxItemPosition+"minItemPosition="+minItemPosition);
		System.out.println("====pointeredViewIndex="+pointeredViewIndex);
	}
}