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"};@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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Geometric-Transformations图像几何变换halcon算子,持续更新

目录affine_trans_imageaffine_trans_image_sizeconvert_map_typemap_imagemirror_imagepolar_trans_image_extpolar_trans_image_invprojective_trans_imageprojective_trans_image_sizerotate_imagezoom_image_factorzoom_image_sizeaffine_trans_image 功能&#xff1a;把任…

hibernate inverse属性的作用

hibernate配置文件中有这么一个属性inverse&#xff0c;它是用来指定关联的控制方的。inverse属性默认是false&#xff0c;若为false&#xff0c;则关联由自己控制&#xff0c;若为true&#xff0c;则关联由对方控制。见例子&#xff1a; 一个Parent有多个Child,一个Child只能有…

分布式锁与实现(一)——基于Redis实现

概述 目前几乎很多大型网站及应用都是分布式部署的&#xff0c;分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和…

浅析软件项目管理中十个误区(来自:http://manager.csdn.net/n/20051213/30907.html)

随着计算机硬件水平的不断提高&#xff0c;计算机软件的规模和复杂度也随之增加。计算机软件开发从“个人英雄”时代向团队时代迈进&#xff0c;计算机软件项目的管理也从“作坊式”管理向“软件工厂式”管理迈进。这就要求软件开发人员特别是软件项目管理人员更深一步地理解和…

俩孩随笔

俩孩随笔 有人给我贴了技术男加奶爸的标签&#xff0c;不过这两项都不是我的强项。我深知自己最大的长处在哪&#xff1a;普通&#xff0c;扔人堆里&#xff0c;不是认不出来&#xff0c;而是压根看不着。想把事情做好&#xff0c;常常会用力过度。工作平平淡淡&#xff0c;需…

Inpainting图像修复halcon算子,持续更新

目录harmonic_interpolationinpainting_anisoinpainting_cedinpainting_ctinpainting_mcfinpainting_textureharmonic_interpolation 功能&#xff1a;对一个图像区域执行谐波插值。 inpainting_aniso 功能&#xff1a;通过各向异性扩散执行图像修复。 inpainting_ced 功能…

算法(伪代码)的书写

q ⇒ Queue&#xff08;队列&#xff09;, s ⇒ Set&#xff08;集合&#xff09;pq ⇒ PriorityQueue&#xff08;优先队列&#xff09;d ⇒ distance1. initialization 变量&#xff0c;数据结构的定义&#xff0c;及初始值的赋值&#xff1b;比如著名的 Dijkstra &#xff0…

第八次作业——系统设计与团队分配(个人)

团队作业地址&#xff1a;https://www.cnblogs.com/clio-hhhhhhl/p/9079157.html 个人码云地址&#xff1a;https://gitee.com/Cliohl/events 团队码云地址&#xff1a;https://gitee.com/Cliohl/zhuoyue 项目进展&#xff1a; 上礼拜进展&#xff1a;把部分前端页面实现出来&a…

深入理解Activity启动流程(二)–Activity启动相关类的类图

本文原创作者:Cloud Chou. 欢迎转载&#xff0c;请注明出处和本文链接 本系列博客将详细阐述Activity的启动流程&#xff0c;这些博客基于Cm 10.1源码研究。 在介绍Activity的详细启动流程之前&#xff0c;先为大家介绍Activity启动时涉及到的类&#xff0c;这样大家可以有大概…

Lines色线halcon算子,持续更新

目录bandpass_imagelines_colorlines_facetlines_gaussbandpass_image 功能&#xff1a;使用带通滤波器提取边缘。 lines_color 功能&#xff1a;检测色线和它们的宽度。 lines_facet 功能&#xff1a;使用面模型检测线。 lines_gauss 功能&#xff1a;检测线和它们的宽…

疑问+软件

问题 1学好软件工程需要打好哪些基础&#xff1f; 2怎样学好软件工程&#xff1f; 3软件工程的发展前景如何&#xff1f; 4软件工程具体能从事哪些职业&#xff1f; 5怎样准确的找到自己的定位&#xff1f; 软件 1支付宝 优点&#xff1a;支付便捷&#xff0c;转账方便&#xf…

成功的项目管理

内容提要 第一讲 项目与项目管理 1.项目的基本概念 2.项目管理的概念 3.项目管理的重要性 第二讲 项目管理的最新发展 1.现代项目管理的创立过程 2.现代项目管理的发展趋势 3.项目管理流行的原因 第三讲 信息时代的项目管理 1.信息时代的特点 2.信息时代项目管理的特点 3.按项目…

5月23日

11.1 LAMP架构介绍一、LAMP架构介绍LAMP是LinuxApache(httpd)MySQLPHP的简写&#xff0c;即把Apache、MySQL以及PHP安装在linux系统上&#xff0c;组成一个运行环境来运行PHP脚本语言&#xff0c;通常是网站。比如Google、淘宝、百度、51cto博客、猿课论坛等就是用PHP语言写出来…

Kotlin入门简介

Kotlin的“简历” 来自于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克)起源来自JetBrains的圣彼得堡团队&#xff0c;名称取自圣彼得堡附近的一个小岛(Kotlin Island)一种基于JVM的静态类型编程语言语法简单&#xff0c;不啰嗦 1 2…

LaTeX基础一:安装与基本操作

一、安装 1.首先下载texlive2015.iso文件。再在解压的镜像文件中运行install-tl-advanced.bat批处理命令。注意要关闭杀毒软件&#xff0c;否则可能会出现错误。2.可以修改一下安装路径&#xff0c;只要更改一个&#xff0c;其他也随之更改&#xff1a;3.把不要安装的语言包去掉…

Match图像匹配halcon算子,持续更新

目录exhaustive_matchexhaustive_match_mggen_gauss_pyramidmonotonyexhaustive_match 功能&#xff1a;模板和图像的匹配。 exhaustive_match_mg 功能&#xff1a;在一个分辨率塔式结构中匹配模板和图像。 gen_gauss_pyramid 功能&#xff1a;计算一个高斯金字塔。 mono…

c++虚函数的前奏--函数指针与回调

声明函数指针并实现回调程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数&#xff0c;不包括完全依赖于不同语法和语义规则的类成员函数&#xff08;类成员指针将在另文中讨论&#xff09;。 声明函数指针 …

你的微信,到底「连接」多少人?

作为一个技术人&#xff0c;用微信这么多年&#xff0c;也加了不少的好友和技术群。大半个月前&#xff0c;大概是5月初的时候&#xff0c;萌生了这个想法。 前后磕磕绊绊&#xff0c;经过了来美帝出差前期差点饿死、项目紧急期等艰难阶段以及各种自学、温习和设计&#xff0c;…

团队项目第一周总结

团队项目第一周总结 今天是周一&#xff0c;项目的进展周期已经进行了一周&#xff0c;做一个大概的总结吧。 周的工作先是定下团队的项目方向&#xff0c;大家技术程度各有不同&#xff0c;因此想大一统的定下一个有些稍稍的花费时间。定好《基于大数据的日志分析》这个题目后…

电路宽度测量halcon例子

一个halcon处理的例子 目录处理要求&#xff1a;原图&#xff1a;处理程序&#xff1a;处理结果&#xff1a;处理要求&#xff1a; 根据客户给的宽度&#xff0c;计算出电路宽度太窄的为NG 原图&#xff1a; 处理程序&#xff1a; read_image (Image, 1.png) rgb1_to_gray(I…