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"};@Overrideprotected 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"><ImageViewandroid:id="@+id/fruit_img"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid: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@Overridepublic 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);elseview =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);}}@Overridepublic 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;}//在每一个子项被滚动到屏幕内时执行
    @Overridepublic void onBindViewHolder(viewHolder holder, int position) {Fruit fruit = fruitList.get(position);holder.fruitText.setText(fruit.getName());holder.fruitImage.setImageResource(fruit.getImageID());}@Overridepublic 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"><ImageViewandroid:id="@+id/fruit_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/next_24px"android:layout_gravity="center_horizontal"/><TextViewandroid: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的强大之处在于,他可以轻松实现子项中任意控件或布局的点击事件。

小结

转载于:https://www.cnblogs.com/MrSaver/p/6883465.html

Android:日常学习笔记(8)———探究UI开发(5)相关推荐

  1. Android:日常学习笔记(8)———探究UI开发(2)

    Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...

  2. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

  3. 安卓开发Android studio学习笔记12:读取解析XML(案例演示)

    Android studio学习笔记 第一步:配置Student.XML 第二步:配置activity_main.xml 第三步:配置student.xml 第四步:配置Student用户类 第五步: ...

  4. java/android 设计模式学习笔记(6)---适配器模式

    这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...

  5. 疯狂Android讲义 - 学习笔记(二)

    疯狂Android讲义 - 学习笔记(二) Android应用的用户界面编程 2.1 界面编程与视图(View)组件 Android应用的绝大部分UI组件放在android.widget.androi ...

  6. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  7. Android Binder 学习笔记

    前言: Binder是Android给我们提供的一种跨进程通信方式.理解Binder能帮助我们更好的理解Android的系统设计,比如说四大组件,AMS,WMS等系统服务的底层通信机制就都是基于Bin ...

  8. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  9. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

最新文章

  1. android 5秒后进入,Android/Java:如何在5秒后停止下载?
  2. 通用数据库管理工具DBeaver
  3. flask+sqlite3+echarts3+ajax 异步数据加载
  4. Jquery控制select实现dataTables数据联动刷新
  5. 编程之美系列之二——寻找出现频率超过一半的数
  6. c语言330转化成字符,c/字符串,字符转数字,数字转字符(转)
  7. docker中创建Jmeter及在外部使用JMeter-Server控制
  8. 引用wx.getclipboarddata中的内容_教材、图书在引用时要注意哪些方面
  9. ppt扇形图怎么显示数据_前方高能!多维数据分析的神器雷达图PPT制作教程来啦!...
  10. Java集合(三):Queue队列
  11. 【计算机网络复习】1.1.4 时延、时延带宽积、RRT和利用率
  12. python 3.3.3 字面量,正则,反斜杠和原始字符串
  13. atitit .大数据的方法,技术.attilax总结 大数据包含哪些方面 v5 s09..docx 7. 三大核心技术:拿数据,处理转换,算数据 2 8. 大数据有5个部分。数据采集,数据存储,
  14. 【TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】
  15. 无线领夹式麦克风方案,专门为USB-C接口手机打造的直播方案
  16. 学习笔记之极客时间《Java 核心技术面试精讲》
  17. 微处理器 微型计算机系统,(计算机)什么是“微处理器、微型计算机、微型计算机系统,以及它们区别和联系?...
  18. python_大智慧SAR指标编写
  19. 网站打开速度慢怎么解决
  20. 软件工程计算机水平 推荐表,软件工程就业推荐表2014届.doc

热门文章

  1. jQuery利用JSONP解决AJAX跨域请求
  2. batch lr替代关系_建立关系的替代方法
  3. mlflow_在生产中设置MLflow
  4. 熬夜所带来的伤害,远比我们想象的更可怕
  5. DCASE挑战赛原始提案文件(详细信息)
  6. Android缩放比例公式,android开发 缩放到指定比例的尺寸
  7. Liner(分段线性插值)
  8. 有了CodinGame,玩着游戏就能学编程
  9. linux 查看进程
  10. MySQL索引设计原则