欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

listview的一些不知所以的问题

程序员文章站 2022-05-25 19:56:34
...

用到lisview但是本身我不会,所以写一个博客来记录期间的一些问题

1、首先,listview的作用,就像名字一样,作为一个列表显示的控件,当然了,是垂直的。

2、一些基本属性:(摘抄自:https://www.cnblogs.com/bluestorm/p/3699258.html

android:transcriptMode="alwaysScroll"   

android:cacheColorHint="#00000000"

android:listSelector="@color/pink" listView item 选中时的颜色。默认为橙黄底色。

 

android:divider="#f9b68b"  //分割线颜色

android:dividerHeight="1dp"  //分割线边距

android:scrollbars="none"  //不显示滚动条

android:fadingEdge="none"   去掉上边和下边黑色的阴影

 

// 设置Item之间无间隙

android:divider="#00000000" 或者在javaCode中如下定义:listView.setDividerHeight(0);

android:divider="@drawable/list_driver" 设置分割线的图片资源,如果则只要设置为

android:divider="@drawable/@null" 不想显示分割线

 

android:scrollbars="none" setVerticalScrollBarEnabled(true); 隐藏listView的滚动条

android:fadeScrollbars="true" 设置为true就可以实现滚动条的自动隐藏和显示

 

android:transcriptMode="alwaysScroll"    用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。

 

android:fadingEdge="none" 去掉上边和下边黑色的阴影

 

android:fastScrollEnabled="false"
android:fastScrollEnabled = "true" 加快滑动速度

android:drawSelectorOnTop="false"
android:scrollingCache="false" ??????????????

android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到

android:drawSelectorOnTop="false" 点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的

 


首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false

android:stackFromBottom="true"  

         

第二是transciptMode属性,需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。
android:transcriptMode="alwaysScroll"   

 

第三cacheColorHint属性,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:background="@drawable/bg",不过不要高兴地太早,当你这么做以后,发现背景是变了,但是当你拖动,或者点击list空白位置的时候发现ListItem都变成黑色的了,破坏了整体效果。

如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色,如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了

 

第四divider属性,该属性作用是每一项之间需要设置一个图片做为间隔,或是去掉item之间的分割线

android:divider="@drawable/list_driver"  其中  @drawable/list_driver 是一个图片资源,如果不想显示分割线则只要设置为android:divider="@drawable/@null" 就可以了

 

第五fadingEdge属性,上边和下边有黑色的阴影

android:fadingEdge="none" 设置后没有阴影了~

 

第六scrollbars属性,作用是隐藏listView的滚动条,

android:scrollbars="none"与setVerticalScrollBarEnabled(true);的效果是一样的,不活动的时候隐藏,活动的时候也隐藏

 

第七fadeScrollbars属性,android:fadeScrollbars="true"  配置ListView布局的时候,设置这个属性为true就可以实现滚动条的自动隐藏和显示。

 

第八fastScrollEnabled属性 ,

很多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,这里Android开发网告诉大家,辅助滚动滑块只需要一行代码就可以搞定,如果你使用XML布局只需要在ListView节点中加入  android:fastScrollEnabled="true" 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。 还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,同时该方法仍然是AbsListView的基础方法,可以在ListView或GridView等子类中使用快速滚动辅助。

 

第九drawSelectorOnTop属性

When set to true, the selector will be drawn over the selecteditem. Otherwise the selector is drawn behind the selected item. Thedefault value is false.

android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到

android:drawSelectorOnTop="false"点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的

3、使用

xml、

 <ListView 
        android:id="@+id/lv_showNoBehindName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:footerDividersEnabled="true"
        android:headerDividersEnabled="true"
        />

Java、

获取listview,

private ListView lv_showNoBehindName;

lv_showNoBehindName = (ListView) findViewById(R.id.lv_showNoBehindName);

设置adapter数据源

adapter的几个参数含义:

参数一:上下文对象

参数二:就是你要用哪个页面来装你的数据,我这里是一个安卓内置的页面,只有一个textview

参数三:数据源

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_expandable_list_item_1, pathDatas);
// 设置adapter
		lv_showNoBehindName.setAdapter(adapter);

listview列表项的点击事件:

点击事件参数含义:(不知道在哪里copy的,所以这里不妨链接了,因为是早就放在我的代码里面的)

参数一:parent:官方解释为:The AdapterView where the click happened,也就是用户所点击的AdapterView,这个参数一般不用。

 参数二:view:当前点击的列表项所对应的布局View对象,可通过这个参数获得相应的列表项内部的组件,进而对其进行操作。举个例子,假设有一个ListView,含有4个列表项,你点了第2个,那么通过view你就可以操作第2个列表项里面的TextView、ImageView等等的组件(假设存在)。

参数三:position:当前点击的列表项的位置,从0开始,也就是点击第n个,position就是n-1。

参数四:id:当前点击的列表项的序号,也是从0开始,一般情况下position和id是一样的。

 

lv_showNoBehindName.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View view,
					int position, long id) {
				Log.d("ppx", view.getTag() + "tag--看看这个是个什么鬼路径");
				// 自带的layout的textview
				TextView name = (TextView) findViewById(android.R.id.text1);
				}
		});

小白一脸茫然的不知道去哪里setTag,边学边写。。

获取item列表项的数据:

一定要自定义的adapter才可以获取到item的数据,,切记

不知道在哪里看到的,但是实际上并不是啊。

刷新数据:

adapter.notifyDataSetChanged();

未完待续。。

8-4

后来发现,自带的item的view不能显示图片,于是自定义了一个可以显示图片的item的view

xml、

<ImageView
        android:id="@+id/show_pathImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:contentDescription="@string/image_description" />

    <TextView
        android:id="@+id/show_pathName"
        android:layout_width="fill_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:gravity="center_vertical"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:textAppearance="?android:attr/textAppearanceListItem"
        android:layout_marginLeft="20.0px" />

后来又发现ArrayAdapter不能显示图片,于是改用了SimpleAdapter:代码

SimpleAdapter mySimpleAdapter = new SimpleAdapter(this, Listmap,
				R.layout.show_pathimage_imageview, new String[] {
						"show_pathImage", "show_pathName" }, new int[] {
						R.id.show_pathImage, R.id.show_pathName });

几个参数含义:

参数一:上下文对象

参数二:数据源

参数三:自定义的item的页面

参数四:数组中的数据源的键对应到自定义item布局的view中,我一般都是控件id

参数五:要将hash数据放入对应的哪个控件

我的hash数据

HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("show_pathImage", R.drawable.ic_launcher);
			map.put("show_pathName", pathDatas[i]);
			Listmap.add(map);

至此,就可以显示列表数据了。

当然啦,我们的目标当然不是只是显示,而是要通过点击显示的图片名称显示对应的大图~

于是,listview的点击事件:

lv_showNoBehindName.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				Log.d("ppx", "------");
				HashMap<String, Object> currentHash = Listmap.get(arg2);
				String s = currentHash.get("show_pathName").toString();
				Log.d("ppx", "--这个图片名称"+s);
			}
		});

然后,死活没有显示??,容我再看看。。

emmmmm.....其实一直都有log显示啊,Wr,只是因为我自己选错了项目去查看日志,md。

ok,既然都已经获取到了点击的item的图片名称了,就可以根据这个图片名称去获取到对应的图片的路径然后设置到imageview显示就可以了,话说这里不用刷新也可以变?不知道为什么。

8-6

ok,现在我们已经可以在自动播放的时候点击显示图片名称按钮然后显示所有的图片名称,然后点击图片名称显示对应的大图,现在该在显示大图之后做自动播放,需要获取到显示的图片的下标,然后做一个自动播放。

Java、

获取点击的item的图片id,arg2就是当前item的id

	// listview的item的点击事件
		lv_showNoBehindName.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				currentPosition = arg2;
				HashMap<String, Object> currentHash = Listmap.get(arg2);
				// 点击的item的值,图片名称
				String s = currentHash.get("show_pathName").toString();
				// Log.d("ppx", "--这个图片名称" + s);
				for (FilePhotoInfo f : filelist) {
					String path = f.getPath();
					// 如果path与list里面的值相同就设置图片并隐藏listview
					if (path.substring(path.lastIndexOf("/") + 1,
							path.lastIndexOf(".")).equals(s)) {
						lv_showNoBehindName.setVisibility(View.GONE);
						iv_showPathImage.setImageURI(Uri.parse(path));

						mHandler.sendEmptyMessage(100);
					}
				}
			}
		});

根据获取到的下标去数据里面找寻对应的图片名称,根据名称在集合里面遍历获取对应的路径,设置图片显示,延迟,自动播放

MainActivity main = new MainActivity();
	Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
			case 100:
				// String str = pathDatas[currentPosition];
				// 获取到点击的那个item的下标--》遍历含有图片路径的集合根据下标获取到对应的图片的路径作为第一张显示的图片继续显示--》自动播放

				String pathOne = pathDatas[currentPosition++ % pathDatas.length];
				for (FilePhotoInfo f : filelist) {
					String path = f.getPath();
					if (path.substring(path.lastIndexOf("/") + 1,
							path.lastIndexOf(".")).equals(pathOne)) {
						iv_showPathImage.setImageBitmap(main.getThumbNail(path,
								400, 400));
						Log.d("ppx", "--" + currentPosition + ",,,,," + path);
						mHandler.sendEmptyMessageDelayed(100, 3000);
					}
				}
				break;

			default:
				break;
			}
		}
	};

 

相关标签: listview