码迷,mamicode.com
首页 > 移动开发 > 详细

安卓017ListView & GridView & ScrollView

时间:2016-05-12 14:40:11      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

ListView 在APP开发中几乎无处不在,重要性,不言而喻!


XML 代码:
<ListView android:id="@+id/mylistView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/ctype">
</ListView>


常用属性:
android:divider 用于为列表实例设置分隔条,可以用颜色分隔,也可以用Drawable资源分隔
android:dividerHeight  用于设置分隔条的高度
android:entries 列表的数据源
android:footerDividerEnabled  用于设置是否在 footer View 之前绘制分隔条,默认值为
true,设置为 false 時,表示不会绘制,使用该属性时,需要通过 LiswView 组件提供的
addFooterView()方法为 ListView 设置 footer View
android:headerDividersEnabled  用于设置是否在 header View 之后绘制分隔条, 默认
值为 true,设置为 false 時,表示不会绘制,使用该属性时需要通过 LiswView 组件提供的
addHeaderView()方法为 ListView 设置 header View



ListView  与(Array/Simple)Adapter  的使用

1.ArrayAdapter :
数据源数组或集合
构造器new ArrayAdapter(this,xml,数据源);
String [] ctype={};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item1, ctype);
ArrayAdapter<CharSequence>
adapter2=ArrayAdapter.createFromResource(this, R.array.ctype,
android.R.layout.simple_list_item1);


2.SimpleAdapter:
数据源 List<Map<String,?>>
构 造 器 : new  SimpleAdapter(this, 数 据 源 ,xml,new  String[]{key1,key2},new
int[]{R.id.image,R.id.textview});
说明:

①key 为数据源 Map 的键
②String[]和 int[]必须一一对应

android.R.layout.simple_list_item_multiple_choice:每个列表项目都带多选框文本
android.R.layout.simple_list_item_1 每个列表项都是一个普通的文本
android.R.layout.simple_list_item_2 每个列表项都是一个普通的文本(字体略大)
android.R.layout.simple_list_item_checked 每个列表项都有一个已勾选的列表项
android.R.layout.simple_list_item_single_choice 每个列表项都是带单选按钮的文本
常用的监听方法
listView.setOnItemClickListener(new OnItemClickListener()
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View  view, int position,long id) {
String res = parent.getItemAtPosition(position).toString();
Toast.makeText(MainActivity.this, res, Toast.LENGTH_SHORT).show();
}
});



Adapter 和 和 AdapterView  区别
Adapter:根据给定的数据源分配一个布局
AdapterView:为 Adapter 提供一个 View(ListView,GridView,Spinner)
说明
去掉 ListView 滚动条的方法
lv.setVerticalScrollBarEnabled(false);
去掉 ListView 分割线的方法
lv.setDivider(null);


ListView  的优化

思路: 

系统显示列表(ListView)时,首先会实例化一个适配器,本文将实例化一个自定义
的适配器。实现自定义适配器,必须手动映射数据,这时就需要重写 getView()方法,系统在绘制列表的每
一行的时候将调用此方法。
ListView 在开始绘制的时候系统自动调用 getCount()函数,根据函数返回值得到 ListView的长度,
然后根据这个长度,调用 getView()逐一画出每一行


具体使用方法可以参考下面代码,只需记住

 Android 自定义 ListView 三步骤:

第一步:准备主布局文件、组件布局文件等使用 LayoutInfiter 动态加载
第二步:获取并整理数据
第三部:绑定数据,这里我们是通过自己编写 Adapter 类来完成的

1.创建一个类,继承 BaseAdapter
2.重写方法

@Override
public int getCount() {
// 返回数据源的大小
return getList().size();
}
@Override
public Object getItem(int position) {
// 根据 position 返回一个 item 对象
return getList().get(position);
}
@Override
public long getItemId(int position) {
//根据 position 返回行数
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//浪费资源的错误写法
// LayoutInflater inflater = getLayoutInflater();
// View view = inflater.inflate(R.layout.items, null);
// TextView tv = (TextView) view.findViewById(R.id.textView1);
// tv.setText(getList().get(position));
// System.out.println("position-->" + position);
//正确写法
View view = null;
if(convertView == null){
LayoutInflater inflater = getLayoutInflater();
view = inflater.inflate(R.layout.items, null);
}else{
//如果 convertView 不为空,说明该 view 之前加载进来过,所以直接将其赋给 view,即反复
使用,避免再创建新的 view 浪费资源
view = convertView;
}
TextView tv = (TextView) view.findViewById(R.id.textView1);
tv.setText(getList().get(position));
System.out.println("position-->" + position);
return view;
}


ListView 之 之 AsyncTask  加载网络数据-XML&json

1、城市列表 json 的接口:
http://127.0.0.1/DataServer/CityServlet?type=json
2、城市列表 xml 的接口:
http://127.0.0.1/DataServer/CityServlet?type=xml


【扩展】ListActivity


一、定义:一个包含 ListView 的 Activity
二、使用:
1.不需要定义 xml 布局文件
2.在 Activity 的 onCreate()方法中,不需要 setContentView()方法
3.使用方式与 ListView 方式类似,注意设置 Adapter 时,使用的是 setListAdapter 方法
比如:setListAdapter(adapter);
4.添加点击事件
①设置监听器
getListView.setOnItemClickListener()...
②使用回调方法
onListItemClick()
public class MainActivity extends ListActivity {
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 创建用于 ListView 指定列表项的适配器
String[] ctype = new String[] { "情景模式", "主题模式", "手机", "程序
管理" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, andro
id.R.layout.simple_list_item_1, ctype);
setListAdapter(adapter);
}
}


【扩展】ExpandableListView


功能:是一个二级列表,分为 group 和 child,group 表示一级列表,child 表示二级列表
和 ListView 不同的是它是一个两级的滚动列表视图,每一个组可以展开,显示一些子项,
这些项目来至于ExpandableListAdapter的子类,也就是说,要实现向里面添加项目,必须写一个
子类实现 ExpandableListAdapter 的接口或者使用系统为我们实现在子类
BaseExpandableListAdapter,
SimpleExpandableListAdapter
适配器
// 数据
private List<String> groupData;// 定义组数据
private List<List<String>> childrenData;// 定义组中的子数据
// 上下文
private Context context;
// 布局文件加载器
private LayoutInflater inflater;
/**
* 构造器
*
* @param groupData
* @param childrenData
* @param context
*/
public MyExpandableListAdapter(List<String> groupData, List<List<Strin
g>> childrenData, Context context) {
super();
this.groupData = groupData;
this.childrenData = childrenData;
this.context = context;
this.inflater = LayoutInflater.from(context);
}
/**
* 得到组的数量
*/
@Override
publicint getGroupCount() {
returngroupData != null ? groupData.size() : 0;
}
/**
* 得到哪一组下面的子类个数
*/
@Override
public int getChildrenCount(intgroupPosition) {
returnchildrenData.get(groupPosition) != null ? childrenData.get(gr
oupPosition).size() : 0;
}
/**
* 得到组
*/
@Override
public Object getGroup(intgroupPosition) {
returnthis.groupData.get(groupPosition);
}
/**
* 得到组下面的子项
*/
@Override
public Object getChild(intgroupPosition, intchildPosition) {
returnthis.childrenData.get(groupPosition).get(childPosition);
}
/**
* 得到组位置
*/
@Override
publiclong getGroupId(intgroupPosition) {
returngroupPosition;
}
/**
* 组下面的子项位置
*/
@Override
publiclong getChildId(intgroupPosition, intchildPosition) {
returnchildPosition;
}
@Override
publicboolean hasStableIds() {
returnfalse;
}
@Override
public View getGroupView(intgroupPosition, booleanisExpanded, View conv
ertView, ViewGroup parent) {
TextView tv = null;
if (convertView == null) {
tv = (TextView) inflater.inflate(android.R.layout.simple_list_i
tem_1,null);
convertView = tv;
} else {
tv = (TextView) convertView;
}
// 设置数据
tv.setText(" "+groupData.get(groupPosition));
returntv;
}
@Override
publicView getChildView(intgroupPosition, intchildPosition, booleanisLa
stChild, View convertView,
ViewGroup parent) {
TextView tv = null;
if (convertView == null) {
tv = (TextView) inflater.inflate(android.R.layout.simple_list_i
tem_1,null);
convertView = tv;
} else {
tv = (TextView) convertView;
}
// 设置数据
tv.setText(" "+childrenData.get(groupPosition).get(childPosit
ion));
return tv;
}
/**
* //child 是否可以被点击,true 可以点,false 不可以点
*/
@Override
publicboolean isChildSelectable(intgroupPosition, intchildPosition) {
return true;
}
监听器
OnChildClickListener:单击 child 会触发该监听器
exListView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
Toast.makeText(getApplicationContext()
, child.get(groupPosition).get(childPosition) + "", Toast.LENGTH_SHORT).show();
return false;
}
});


ListView  分页

在使用的时候,将服务器端所有的数据下载并显示出来是不适宜的,我们需要将服务器端的
数据进行分页显示,当用户下拉到底部时,更新下一页内容
1. 服务器端:
将数据进行分页,通过页码区分数据,比如
第一页
第二页
2. 客户端
(1)思路:客户端首先需要加载第一页内容,当用户下拉到 ListView 底部时更新下一页内容,
并显示
(2)步骤:
①首先通过异步任务下载第一页内容,并更新到 ListView
②判断用户下拉到 ListView 底部,需要使用 onScrollListener
③下拉到最底部后要显示加载的进度条,数据加载完毕要隐藏

lv.setOnScrollListener(new OnScrollListener() {
/**
* 返回用户滑动手机屏幕的状态,具体分为三种 SCROLL_STATE_IDLE:0,用户停止滑动,即松手
* SCROLL_STATE_TOUCH_SCROLL:1,用户正在滑动,手指一直触摸屏幕
* SCROLL_STATE_FLING:2,用户正在滑动并且伴随惯性移动
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
System.out.println(“------“ + scrollState);
if (isBottom && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
Toast.makeText(getApplicationContext(), “正在下载数据。。。”, Toast.LENGTH_SHORT).show();
foodView.setVisibility(View.VISIBLE);
new MyAsyncTask().execute();
}
}
/**
* firstVisibleItem:返回曾经已见但现在移出屏幕的项的索引
* visibleItemCount:显示当前屏幕所显示的项的索引 totalItemCount:返回所有项的总数
* 注意:当firstVisibleItem + visibleItemCount
* =totalItemCount时,说明已滑动到屏幕底部
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
isBottom = (firstVisibleItem + visibleItemCount == totalItemCount);
}});

ListView+CheckBox

一、引入:在 android 系统的点击事件中,ListView 中 Item 的点击事件的优先级要高于
CheckBox 的点击事件,当在布局文件中加入 CheckBox 后 onItemClickListener 会失效
二、解决办法:
1 ,使用 CheckBox  里让其不能获得焦点
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false" -------here
android:focusable="false"-------here
android:focusableInTouchMode="false"/>
2 ,定义一个集合去存放哪些选中了,哪些没选中
// 用来控制 CheckBox 的选中状况
private HashMap<Integer, Boolean> isSelected;


Bitmap 和 和 BitmapFactory  的简易使用

一、Bitmap 类
Bitmap 类代表位图,它是 Android 系统中图像处理的最重要类之一,使用它不仅可以
获取图像文件信息,进行图像剪切,旋转,缩放等操作,而且还可以指定格式保存图像文件。
Bitmap 类常用的方法
二、BitmapFactory 类
该类为一个工具类,用于从不同的数据源来解析,创建 BitMap 对象。
常用方法如下:
方法 描述
decodeFile(String pathName)  用于从给定的路径所指定的文件中解析、创
建 Bitmap 对象
decodeResource(Resources res, int id)  用于根据给定的资源 ID 从指定的资源中解
析、创建 Bitmap 对象
decodeStream(InputStream is)  用于从指定的输入流中解析、创建 Bitmap
对象

三、如何从 SD 卡中解析图片文档

String path=”/sdcard/picture/bccd/img01.jpg”
Bitmap bm=BitmapFactory.decodeFile(path);
从资源文件中解析图片
Bitmap bm=BitmapFacotry.decodeResource(MainActivity.this.getResources(),R.drawable.img02);

 异步加载图片及文字的 ListView

实际开发中,针对 ListView 会显示有图片,标题,时间等,比如网易新闻客户端
步骤
1,创建自定义的布局文件
2,请求网络 JSON
3,加载数据
4 ,对于每一条数据再启动一个线程去下载图片


GridView  的使用

1.定义:显示二维,网格状的 view 和 ListView 属于同一级别,继承子 AbsListView
XML  语法
<GridView
android:id="@+id/gridView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchMode="columnWidth"
android:numColumns="4">
</GridView>
常用属性
①android:columnWidth : 列宽
②android:gravity : 对齐方式,一般为 center
③android:horizontalSpacing : 水平空白,列之间的间距
④android:verticalSpacing : 垂直空白,行之间的间距
⑤android:numColumns : 列数,auto_fit:自适应,即根据屏幕的宽度决定列数
⑥android:stretchMode : 伸展模式,属性如下:
STRETCH_COLUMN_WIDTH:根据列宽伸展,与 gravity 配合使用,可使 view 居中
STRETCH_SPACING:根据空白伸展,与 gravity 配合使用,可使 view 左对齐
STRETCH_SPACING_UNIFORM:均匀空白伸展,与 gravity 配合使用,可使 view 右对齐
数据加载要使用适配器
1,ArrayAdapter
2,SimpleAdapter
3,自定义 Adapter
常用事件
OnItemClickListener
综上,其实 GridView 和 和 ListView  除了显示方式不一样,其它的都一样


ScrollView

滚动视图用于为其它组件添加滚动条,在默认的情况下,当窗体中内容比较多,而一屏
显示不下时,超出的部分不能被用户所看到.因为 Android 的布局管理器本身没有提供滚动屏
幕的功能.如果要让其滚动,就要使用滚动视图 ScrllView.
滚动视图是 FrameLayout 的子类,因此,在滚动视图中,可以添加任何想要放入其中的组件,但
是一个滚动视图中只能放一个组件,如果要放置多个,可以先放一个存布局管理器.再将要放
置的组件放置到该布局管理器中, 在滚动视图中, 使用比较多的是线性布局管理器.
XML 语法:
<ScrollView
android:id="@+id/myscollView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
放置组件, 只能放一个哦
</ScrollView>
常用属性
android:scrollbars 设置滚动条显示。none(隐藏),horizontal(水平),vertical(垂直)。
android:scrollbarFadeDuration 设置滚动条淡出效果(从有到慢慢的变淡直至消失)时间,
以毫秒为单位。Android2.2 中滚动条滚动完之后会消失,再滚动又会出来,在 1.5、1.6 版本
里面会一直显示着。
android:scrollbarSize 设置滚动条的宽度。
android:scrollbarStyle 设置滚动条的风格和位置。设置值:insideOverlay、insideInset、
outsideOverlay、outsideInset
android:scrollbarThumbHorizontal 设置水平滚动条的 drawable。
android:scrollbarThumbVertical 设置垂直滚动条的 drawable
android:scrollbarTrackHorizontal 设置水平滚动条背景(轨迹)的色 drawable
android:soundEffectsEnabled 设置点击或触摸时是否有声音效果
效果图

HorizontalScrollView

水平滚动视图 HorizontalScrollView 如网易新闻的标题
XML  语法
<HorizontalScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"/>
</HorizontalScrollView>











安卓017ListView & GridView & ScrollView

标签:

原文地址:http://blog.csdn.net/opera95/article/details/51360221

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!