Android:日常学习笔记(8)———探究UI开发(5)
Android:日常学习笔记(8)———探究UI开发(5)
ListView控件的使用
ListView概述
A view that shows items in a vertically scrolling list. The items come from the ListAdapter associated with this view.
1.关于ArrayAdapter:
ArrayAdapter<T> 是 ListAdapter的直接子类:一个由任意对象数组支持的具体的BaseAdapter。
一个支持任意对象数组的具体的BaseAdapter。默认情况下,这个类期望提供的资源id引用一个TextView。如果你使用更加复杂的布局, 使用需要字段id的构造函数。 That field id should reference a TextView in the larger layout resource.
However the TextView is referenced, it will be filled with the toString() of each object in the array. You can add lists or arrays of custom objects. Override the toString() method of your objects to determine what text will be displayed for the item in the list.
To use something other than TextViews for the array display, for instance, ImageViews, or to have some of data besides toString() results fill the views, override
getView(int, View, ViewGroup)to return the type of view you want.
2.关于getView(int, View, ViewGroup)获得一个可以在指定位置显示数据集中数据的视图。你可以手动创作一个视图也可以加载XML中的视图。 When the View is inflated, the parent View (GridView, ListView...) will apply default layout parameters unless you use
inflate(int, android.view.ViewGroup, boolean)to specify a root view and to prevent attachment to the root.
ListView的简单用法
public class MainActivity extends AppCompatActivity {
private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry",
"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry",
"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayAdapter<String> adapter = new ArrayAdapter<String>
(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,data);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
}
说明:
ArrayAdapter通过泛型来指定要适配的数据类型,然后在构造函数中把当前上下文、ListView子项布局的ID、要适配的数据传入。
我们在这里使用了安卓的内置布局文件。
ListView设置适配器,setAdapter(),将构建好的适配器对象传进去,以此建立数据与ListView之间的关系。
定制ListView界面
1.定义一个实体类
public class Fruit {
private String name;
private int imageID;
public Fruit(String name, int imageID) {
this.name = name;
this.imageID = imageID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImageID() {
return imageID;
}
public void setImageID(int imageID) {
this.imageID = imageID;
}
}
2.自定义子项布局文件
<?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">
<ImageView
android:id="@+id/fruit_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/fruit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"/>
</LinearLayout>
3.编写适配类
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceID;
public FruitAdapter(@NonNull Context context, @LayoutRes int resource, @IdRes int textViewResourceId, @NonNull List<Fruit> objects) {
super(context, resource, textViewResourceId, objects);
resourceID = textViewResourceId;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Fruit fruit = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_img);
TextView fruitText = (TextView) view.findViewById(R.id.fruit_text);
fruitImage.setImageResource(fruit.getImageID());
fruitText.setText(fruit.getName());
return view;
}
}
4.应用
public class MainActivity extends AppCompatActivity {
private List<Fruit> fruitList=new ArrayList<>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFruits();
FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.activity_main,R.layout.entry_fruit_item,fruitList);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
}
public void initFruits()
{
for(int i=0;i<100;i++)
{
fruitList.add(new Fruit("XXX",R.drawable.next_24px));
}
}
}
提升ListView的运行效率
1.避免重复加载布局文件
在getView中加入如下代码:
//convertView用于将之前加载好的布局进行缓存,这里进行判断,避免重复加载。
if(convertView==null)
view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
else
view =convertView;
2.避免重复查找控件
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Fruit fruit = getItem(position);
View view;
ViewHolder viewHolder;
//convertView用于将之前加载好的布局进行缓存,这里进行判断,避免重复加载。
if(convertView==null)
{
view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
viewHolder= new ViewHolder();
viewHolder.fruitImage=(ImageView) view.findViewById(R.id.fruit_img);
viewHolder.fruitText=(TextView) view.findViewById(R.id.fruit_text);
view.setTag(viewHolder);
}
else
{
view =convertView;
viewHolder= (ViewHolder) view.getTag();
}
viewHolder.fruitImage.setImageResource(fruit.getImageID());
viewHolder.fruitText.setText(fruit.getName());
return view;
}
//用于对控件的实例进行缓存
class ViewHolder{
ImageView fruitImage;
TextView fruitText;
}
}
ListView的点击事件
FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.activity_main,R.layout.entry_fruit_item,fruitList);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Fruit fruit = fruitList.get(position);
Toast.makeText(MainActivity.this,fruit.getName(),Toast.LENGTH_LONG).show();
}
});
RecyclerView
使用RecyclerView
1.在build.gradle添加相应的依赖库

2.点击Sync Now进行同步。
3.修改XML布局文件

简单使用
1.编写适配器
public class FruitRecyclerAdapter extends RecyclerView.Adapter<FruitRecyclerAdapter.viewHolder> {
private List<Fruit> fruitList;
static class viewHolder extends RecyclerView.ViewHolder
{
ImageView fruitImage;
TextView fruitText;
public viewHolder(View itemView) {
super(itemView);
fruitImage = (ImageView) itemView.findViewById(R.id.fruit_img);
fruitText = (TextView) itemView.findViewById(R.id.fruit_text);
}
}
@Override
public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.entry_fruit_item,parent,false);
viewHolder viewHolder = new viewHolder(view);
return viewHolder;
}
//在每一个子项被滚动到屏幕内时执行
@Override
public void onBindViewHolder(viewHolder holder, int position) {
Fruit fruit = fruitList.get(position);
holder.fruitText.setText(fruit.getName());
holder.fruitImage.setImageResource(fruit.getImageID());
}
@Override
public int getItemCount() {
return fruitList.size();
}
public FruitRecyclerAdapter(List<Fruit> fruitList) {
this.fruitList = fruitList;
}
}
2.应用
public class RecyclerListActivity extends AppCompatActivity {
private List<Fruit> fruitList =new ArrayList<>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initData();
setContentView(R.layout.activity_recycler_list);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
FruitRecyclerAdapter fruitRecyclerAdapter = new FruitRecyclerAdapter(fruitList);
recyclerView.setAdapter(fruitRecyclerAdapter);
}
public void initData()
{
for(int i=0;i<30;i++)
{
Fruit fruit = new Fruit("XXX",R.drawable.next_24px);
fruitList.add(fruit);
}
}
}
实现横向滚动
1.修改布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/fruit_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/next_24px"
android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/fruit_text"
android:text="XXXXX"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
</LinearLayout>
效果如右图所示:
2.在布局管理器中设置布局排布方式为水平
。。。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initData();
setContentView(R.layout.activity_recycler_list);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);
FruitRecyclerAdapter fruitRecyclerAdapter = new FruitRecyclerAdapter(fruitList);
recyclerView.setAdapter(fruitRecyclerAdapter);
}
。。。
说明:
ListView的布局排列规则是由自己管理的,而RecyclerView则将这个工作交给了布局管理器,LayoutManager中置顶了一套可扩展的布局排列接口,子类只要按照接口的规范来实现,就能制定出各种不同排列方式的布局了。
瀑布流布局
效果:

代码:
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
处理点击事件
public viewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.entry_fruit_vertical_item,parent,false);
final viewHolder viewHolder = new viewHolder(view);
viewHolder.fruitView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int position = viewHolder.getAdapterPosition();
Fruit fruit = fruitList.get(position);
Toast.makeText(parent.getContext(),fruit.getName(),Toast.LENGTH_LONG).show();
}
});
return viewHolder;
}
说明:
RecyclerView的强大之处在于,他可以轻松实现子项中任意控件或布局的点击事件。
小结
Android:日常学习笔记(8)———探究UI开发(5)的更多相关文章
- Android:日常学习笔记(7)———探究UI开发(4)
Android:日常学习笔记(7)———探究UI开发(4) UI概述 View 和 ViewGrou Android 应用中的所有用户界面元素都是使用 View 和 ViewGroup 对象构建而成 ...
- Android:日常学习笔记(8)———探究UI开发(3)
Android:日常学习笔记(8)———探究UI开发(3) 详解四种基本布局 前言 布局定义用户界面的视觉结构,如Activity或应用小部件的 UI.您可以通过两种方式声明布局: 在 XML 中声明 ...
- Android:日常学习笔记(8)———探究UI开发(2)
Android:日常学习笔记(8)———探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...
- Android:日常学习笔记(7)———探究UI开发(1)
Android:日常学习笔记(7)———探究UI开发(1) 常用控件的使用方法 TextView 说明:TextView是安卓中最为简单的一个控件,常用来在界面上显示一段文本信息. 代码: <T ...
- Android:日常学习笔记(9)———探究持久化技术
Android:日常学习笔记(9)———探究持久化技术 引入持久化技术 什么是持久化技术 持久化技术就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失 ...
- Android:日常学习笔记(9)———探究广播机制
Android:日常学习笔记(9)———探究广播机制 引入广播机制 Andorid广播机制 广播是任何应用均可接收的消息.系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播.通过将 In ...
- Android:日常学习笔记(6)——探究活动(4)
Android:日常学习笔记(6)——探究活动(4) 活动的启动模式 standard模式 standard是活动默认的启动模式,在不进行显示定义的情况下,所有活动都会自动使用这种启动模式. stan ...
- Android:日常学习笔记(6)——探究活动(3)
Android:日常学习笔记(6)——探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...
- Android:日常学习笔记(5)——探究活动(2)
Android:日常学习笔记(5)——探究活动(2) 使用Intent在活动之间穿梭 什么是Intent Intent时Android程序中各组件之间进行交互的一种重要方式,他不仅可以指明当前组件想要 ...
随机推荐
- python-扫描某一网段下的ip
#!/usr/bin/env python #-*- coding:utf-8 -*- ############################ #File Name: ipscaner.py #Au ...
- 李洪强iOS开发之大神必备的Xcode插件
iOS开发大神必备的Xcode插件 写在前面 工欲善其事,必先利其器,iOS开发中不仅要学会Xcode的基本操作,而且还得学会一些Xcode的使用技巧,如掌握常用的快捷键等,还有就是今天要说到的Xco ...
- OC 字符串出来
//1.获取字符串的长度 NSString * str = @"abcd"; NSUInteger length = [str length]; //str.length; NSL ...
- 把world转成html
本来用php转的 效果不太理想 很不稳定 最后试了下java 效果不错 只记录java的方法好了 其实他们的原理都是一样的啊,都是用到了微软的com 首先是准备工作 下载(明确dll的版本是64位的还 ...
- Servlet 部署
默认情况下,Servlet 应用程序位于路径 <Tomcat-installation-directory>/webapps/ROOT 下,且类文件放在 <Tomcat-instal ...
- 关于在Java中链接SQLServer数据库中失败的原因分析
首先声明:笔者是Java的初学者,并且一值是走在自学的道路上,长久以来只有“度娘”相伴.(加入了各种Java学习群,基本没有热心帮人解决问题的.可以理解-_-!!!)大神级的人物就不必看拙文了,没有什 ...
- phpcms v9 配置sphinx全文索引教程
英文介绍:http://www.sphinxsearch.com/docs/manual-0.9.9.html 一.首先需要在服务器上安装sphinx 在Windows上安装sphinx 1. ...
- sqoop1.99.3配置过程
感谢:http://www.myexception.cn/database/1600202.html 官网配置指导:http://sqoop.apache.org/docs/1.99.3/Instal ...
- linux命令小结
查看IP ip a 测试ip ping 10.0.0.128 测试端口 telnet 10.0.0.128 22 # telnet + ip + 端口 Linux - CentOS 7. ...
- SSH后台管理系统,实现查询+分页
一个搜索框,然后会获取大量信息,将信息进行分页,每一页显示固定条数. mysql中使用“like”和“%%”进行模糊匹配,用“limit”进行分页. 1.首先创建一个页面信息的实体类,代码如下: im ...
