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程序中各组件之间进行交互的一种重要方式,他不仅可以指明当前组件想要 ...
随机推荐
- zeppelin部署
1.下载解压2.修改conf/zeppelin-env.sh,添加如下两行 export ZEPPELIN_PORT= export MASTER=spark://master:7077 3.启动 b ...
- Sublime 中 SFTP插件的使用
首先说明的是Sumblime Text 3,下载安装后,打开软件, 按下Ctrl+Shift+P调出命令面板, 按回车键后弹出下面的 然后 点击左上角的 文件 >SFTP/FTP > Se ...
- linux服务器宕机分析/性能瓶颈分析
linux服务器宕机分析/性能瓶颈分析 服务器宕机原因很多,资源不足.应用.硬件.系统内核bug等,以下一个小例子 服务器宕机了,首先得知道服务器宕机的时间点,然后分析日志查找原因 1.last ...
- DWR相关知识
解决问题:服务器给前台推送消息 用途:聊天,微信签到墙,设备报警
- Hibernate使用xml文件的每个类层次一张表
通过这种继承策略,我们可以通过单表映射整个层次结构. 这里,在表中创建一个额外的列(也称为discriminator列)来标识该类. 让我们先了解问题.下面给出的整个层次类映射到数据库的一个表中图解说 ...
- Java连接Sql Server 2008的简单数据库应用
1.从微软官网下载JDBC驱动包 sqljdbc_4.0.2206.100_chs.exe,双击解压文件到指定目录,我的指定目录是: C:\Program Files\Microsoft JDBC D ...
- ios UICollectionView reloadData无法更新的奇怪问题。
报错 Assertion failure in -[UICollectionViewData invalidateItemsAtIndexPaths:] 近来偶尔用到UICollectionVi ...
- Linux之(Git)服务之windows配置
设置你自己的昵称与email设置本地机器默认commit的昵称与Email. 请使用有意义的名字与email. git config --global user.name "syavingc ...
- centos7 下 的lamp 的安装原创详细教程
时间 : 2017-08-03 目标: 基于CENTOS7 安装 LNMP,liunx的安装不做讲解,主要是 NGINX PHP7 MYSQL 的编译安装 第一节 nginx ...
- ThinkPHP部分内置函数
D.F.S.C.L.A.I 他们都在functions.php这个文件家下面我分别说明一下他们的功能 D() 加载Model类M() 加载Model类 A() 加载Action类L() 获取语言定义C ...