当前位置: 首页 > news >正文

网页分析案例郑州百度网站快速优化

网页分析案例,郑州百度网站快速优化,青海建设工程云网站,设计logo的理念文章目录ListView内置类型的简单运用定制数据类型提升效率点击事件RecyclerView布局管理器点击事件ListView 内置类型的简单运用 由于手机屏幕空间有限#xff0c;能够一次性在屏幕上显示的内容不多#xff0c;当我们的程序有大量数据需要显示的时候就可以借助 ListView 来… 文章目录ListView内置类型的简单运用定制数据类型提升效率点击事件RecyclerView布局管理器点击事件ListView 内置类型的简单运用 由于手机屏幕空间有限能够一次性在屏幕上显示的内容不多当我们的程序有大量数据需要显示的时候就可以借助 ListView 来实现。 布局文件 listview_layout.xml ?xml version1.0 encodingutf-8? androidx.constraintlayout.widget.ConstraintLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentListViewandroid:idid/list_viewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent //androidx.constraintlayout.widget.ConstraintLayout活动文件 ListViewTest.java public class ListViewTest extends AppCompatActivity {private String[] data {Apple,Banana,Orange,Watermelon,Pear,Grape,Pineapple,Strawberry,Cherry, Mango,Apple,Banana,Orange,Watermelon,Pear,Grape,Pineapple,Strawberry,Cherry,Mango};// 数据无法直接传递给 ListViewOverrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.listview_layout);ArrayAdapterString adapter new ArrayAdapterString(this, android.R.layout.simple_list_item_1, data);// 借助适配器传递数据ListView listView (ListView)findViewById(R.id.list_view);listView.setAdapter(adapter);} }ListView 子项布局的 id 为 android.R.layout.simple_list_item_1 其是一个 Android 内置的布局文件内容只有一个 TextView可以用于简单地显示一段文本。ArrayAdapter 构造函数 参数一当前 Context参数二ListView 子项布局的 id此例中为上面提到的 TextView参数三适配布局的数据 运行结果 定制数据类型 如果想要每个水果的名字都对应一张图片那么内置的 String 类型就无法满足需求了因此需要自定义一个 Fruit 类 package com.example.activitytest;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 int getImageId(){return imageId;} }为 ListView 的子项指定一个自定义布局在 layout 目录下新建 fruit_item.xml ?xml version1.0 encodingutf-8? androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentImageViewandroid:idid/fruit_imageandroid:layout_width300dpandroid:layout_height200dpapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentapp:layout_constraintVertical_bias0.0 /TextViewandroid:idid/fruit_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfid/fruit_imageapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/fruit_image //androidx.constraintlayout.widget.ConstraintLayoutImageView显示图片。TextView 显式名称文字居中。 接下来参考书上的内容创建一个自定义适配器 public class FruitAdapter extends ArrayAdapterFruit {private ListFruit fruitList; // 数据private int resourceId; // 子项xml布局文件public FruitAdapter(Context context, int textViewResourceId, ListFruit objects){super(context, textViewResourceId, objects);resourceId textViewResourceId;fruitList objects;}// 重写getView方法加载每个处于屏幕内的子项时调用public View getView(int position, View convertView, ViewGroup parent){Fruit fruit getItem(position); // 获取当前的 Fruit 实例还有一种写法fruitList.get(position)从list中获取单个节点元素View view LayoutInflater.from(getContext()).inflate(resourceId, parent, false);ImageView fruitImage (ImageView) view.findViewById(R.id.fruit_image);fruitImage.setImageResource(fruit.getImageId());TextView fruitName (TextView) view.findViewById(R.id.fruit_name);fruitName.setText(fruitList.get(position).getName());return view;} }构造函数 FruitAdapter 本质上还是雷同于被它 extends 的 ArrayAdapter构造函数参数分析 context指定当前上下文。textViewResourceIdListView 子项布局的 idobjects适配布局的数据 加载每个处于屏幕内的子项时调用的 getView由于我们是重写已有函数因此参数是固定的 position当前 Item 在屏幕中的位置通常搭配 getItem() 返回一个子View以获取当前实例。convertView缓存视图 View如果非null则直接再次对 convertView 复用否则才创建新的 View。parentItem 的 View 的父视图用处的话私以为就是为了充当 inflate 的第二个参数。 LayoutInflater 是根据 Layout XML文件 来生成 对应 View 对象 的系统服务。一般用它之作一件事 inflate加载布局。 inflate 方法 public View inflate (int resource, ViewGroup root, boolean attachToRoot) resource要加载的布局对应的资源 idroot在参数一对应布局外部嵌套一个父布局如果不需要则为 null。attachToRoot是否为加载的布局添加一个 root 的外层容器 为 true 时将子布局添加到父布局中并保存子布局的 layout 配置为 false 时表示只让在子布局中声明的 layout 属性生效但不将子布局添加到父布局中此时想要将子布局添加到父布局中需要调用 addView() 方法。 上述代码中参数三就被赋值为 false这是因为 ListView 继承自 AdapterView继承了 AdapterView 的控件是不支持 AddView() 方法的因为一旦 resource 对应的 View 有了父布局就不能再被添加到 ListView 中了。而参数三为 true 时会自动调用 AddView() 方法关于inflate参数的相关信息详见本文。 // We are supposed to attach all the views we found (int temp) // to root. Do that now. if (root ! null attachToRoot) { // attachToRoot 为 true 时自动调用 addView 方法root.addView(temp, params); }关于 LayoutInflater 与 inflate 可参考本文。 设置显示的图片和文字 通过 findViewById 方法分别获取到 ImagView 和 TextView 的实例分别调用它们的 setImageResource 和 setText 方法来设置显示的图片和文字最后将布局返回 最后修改活动文件 ListViewTest.java 以自定义适配器为 extends ArrayAdapterFruit 的情况为例 public class ListViewTest extends AppCompatActivity {private ListFruit fruitList new ArrayList();Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.listview_layout);initFruits(); // 初始化数据集// 借助适配器传递数据FruitAdapter adapter new FruitAdapter(this, R.layout.fruit_item, fruitList);// FruitAdapter adapter new FruitAdapter(this, fruitList);ListView listView (ListView)findViewById(R.id.list_view);listView.setAdapter(adapter);}private void initFruits(){Fruit apple new Fruit(Apple, R.drawable.ic_launcher_background);fruitList.add(apple);Fruit banana new Fruit(Banana, R.drawable.ic_launcher_foreground);fruitList.add(banana);Fruit orange new Fruit(Orange, R.drawable.cmy1);fruitList.add(orange);Fruit Watermelon new Fruit(Watermelon, R.drawable.cmy2);fruitList.add(Watermelon);Fruit pear new Fruit(Pear, R.drawable.cmy3);fruitList.add(pear);Fruit grape new Fruit(Grape, R.drawable.cmy4);fruitList.add(grape);} }提升效率 在 FruitAdapter 的 getView 方法中每次都通过 LayoutInflater 与 inflate 将布局重新加载了一遍 当 ListView 快速滚动的时候就会成为性能的瓶颈。而之前提到 getView 方法中的 convertView 参数可以缓存 View因此可以利用该参数来提高效率。getView 方法中我们每次都要通过 findViewById 方法创建控件 fruit_image 和 fruit_name 的实例。不如用一个 内部类ViewHolder 来对控件实例进行缓存。 public View getView(int position, View convertView, ViewGroup parent){Fruit fruit (Fruit) getItem(position);ViewHolder viewHolder;if(convertView null){convertView LayoutInflater.from(context).inflate(resourceId, parent, false);viewHolder new ViewHolder();viewHolder.fruitImage convertView.findViewById(R.id.fruit_image);viewHolder.fruitName convertView.findViewById(R.id.fruit_name);convertView.setTag(viewHolder);}else{viewHolder (ViewHolder) convertView.getTag();}viewHolder.fruitImage.setImageResource(fruit.getImageId());viewHolder.fruitName.setText(fruit.getName());return convertView;}class ViewHolder{ImageView fruitImage;TextView fruitName;}总而言之之前每次加载屏幕外的 子项 时都需要进行前文提到的两种操作但在进行改进之后只有第一次加载比如往下滑屏幕的时候执行 convertView null 的代码才需进行前文的两项操作之后加载时比如滑到底了再往上滑就是 convertView 非空的情况了。 点击事件 滚动只是视觉效果子项还可以点击。修改活动文件 ListViewTest.java protected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.listview_layout);initFruits();FruitAdapter adapter new FruitAdapter(this, R.layout.fruit_item, fruitList);// FruitAdapter adapter new FruitAdapter(this, fruitList);// 借助适配器传递数据ListView listView (ListView)findViewById(R.id.list_view);listView.setAdapter(adapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){Overridepublic void onItemClick(AdapterView? parent, View view, int position, long id) {Fruit fruit fruitList.get(position);Toast.makeText(ListViewTest.this, fruit.getName(), Toast.LENGTH_SHORT).show();}});/* lambda表达式代替内联函数listView.setOnItemClickListener((AdapterView? parent, View view, int position, long id)-{Fruit fruit fruitList.get(position);Toast.makeText(ListViewTest.this, fruit.getName(), Toast.LENGTH_SHORT).show();});*/}使用 setOnItemClickListener 方法为 ListView 注册了一个监听器点击任何一个子项时回调 onItemClick 方法通过 position 参数获得点击的是哪一个子项获取相应 Fruit 名称并通过 Toast 输出 RecyclerView 布局管理器 ListView 有 性能容易变差、数据只能纵向滚动 的缺点。而 RecyclerView 就支持横向滚动。 为了让所有 Android 版本都能使用RecyclerView 被定义在 support 库中。因此需要使用前要在项目的 build.gradle 文件中添加相应依赖库 修改布局文件 listview_layout.xml 中控件 ListView 为 RecyclerView并修改布局文件名称为 recyclerview_layout.xml ?xml version1.0 encodingutf-8? androidx.constraintlayout.widget.ConstraintLayoutxmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroidx.recyclerview.widget.RecyclerViewandroid:idid/recycler_viewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent//androidx.constraintlayout.widget.ConstraintLayout子项布局文件 fruit_item.xml 和自定义的 Fruit 类无需修改但适配器 FruitAdapter 类需要重新实现原本 getView 方法的职责被三个方法替代 public class FruitAdapter extends RecyclerView.AdapterFruitAdapter.ViewHolder {private ListFruit FruitList;// 构造函数public FruitAdapter(ListFruit fruitList){FruitList fruitList;}// 三个继承自父类的函数// 创建内部类实例NonNullOverridepublic ViewHolder onCreateViewHolder(NonNull ViewGroup parent, int viewType) {View view LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);return new ViewHolder(view);}// 将获得的Fruit实例作为RecyclerView子项控件的值Overridepublic void onBindViewHolder(NonNull ViewHolder holder, int position) {Fruit fruit FruitList.get(position); // 获得子项holder.fruitImage.setImageResource(fruit.getImageId());holder.fruitName.setText(fruit.getName());}// 统计子项数目Overridepublic int getItemCount() {return FruitList null ? 0 : FruitList.size();}// 缓存Fruit属性对应控件的内部类static class ViewHolder extends RecyclerView.ViewHolder{ImageView fruitImage;TextView fruitName;public ViewHolder(NonNull View itemView) {super(itemView);fruitImage itemView.findViewById(R.id.fruit_image);fruitName itemView.findViewById(R.id.fruit_name);}} }活动文件 ListViewTest.java public class ListViewTest extends AppCompatActivity {private ListFruit fruitList new ArrayList();Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.recyclerview_layout);initFruits();RecyclerView recyclerView findViewById(R.id.recycler_view);// 指定RecyclerView布局方式为线性布局LinearLayoutManager linearLayoutManager new LinearLayoutManager(this);recyclerView.setLayoutManager(linearLayoutManager);// 设置适配器recyclerView.setAdapter(new FruitAdapter(fruitList));}private void initFruits(){for(int i 0; i 10; i){Fruit fruit new Fruit(apple, R.drawable.cmy1);fruitList.add(fruit);}} }与 ListView 不同的是需要传入一个布局管理器 LinearLayoutManager 来规定 RecyclerView 是何种布局一般有三种 GridLayoutManager网格布局LinearLayoutManager线性布局StaggeredGridLayoutManager瀑布流布局 这里以瀑布流布局为例 StaggeredGridLayoutManager layoutManager newStaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);// 表示会把布局分为三列并纵向排列 recyclerView.setLayoutManager(layoutManager);运行结果 这里看起来像网格布局是因为每个子项的长宽是一样的当长宽不一样时就会呈现这样的效果 此外还可实现横向滚动 protected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.recyclerview_layout);initFruits();RecyclerView recyclerView findViewById(R.id.recycler_view);// 指定RecyclerView布局方式为线性布局LinearLayoutManager linearLayoutManager new LinearLayoutManager(this);// 布局横向排列以便横向滚动linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);recyclerView.setLayoutManager(linearLayoutManager);// 设置适配器recyclerView.setAdapter(new FruitAdapter(fruitList));}点击事件 不同于 ListViewRecyclerView 没有类似于 setOnItemClickListener 这样的注册监听器方法这需要给子项具体的 View 注册点击事件。 修改适配器类 FruitAdapter.java 的 onCreateViewHolder 函数实现点击 Fruit 子项的文字部分会弹出 Toast 文本点击 Fruit 子项的图片部分会显示大图 public ViewHolder onCreateViewHolder(NonNull ViewGroup parent, int viewType) {View view LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);final ViewHolder holder new ViewHolder(view);holder.itemView.setOnClickListener((View v)-{Toast.makeText(v.getContext(), clicked view, Toast.LENGTH_SHORT).show();});holder.fruitImage.setOnClickListener((View v)-{// 获取当前子项实例int position holder.getAdapterPosition();Fruit fruit FruitList.get(position);// 使用Dialog显示大图final Dialog dialog new Dialog(v.getContext());// 设置缓存图片的ImageView控件ImageView img new ImageView(v.getContext());// 用当前Fruit实例的成员图片id为img控件赋值img.setImageResource(fruit.getImageId());/* 也可以不使用position一连串操作而是通过setImageDrawable将holder.fruitImage的图片显示到img中img.setImageDrawable(holder.fruitImage.getDrawable());*/// 设置dialog弹出内容dialog.setContentView(img);// 对话框背景为透明dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);// 显示dialogdialog.show();// 点击图片取消img.setOnClickListener((View vi)-{dialog.cancel();});});return holder;}点击图片的运行结果
http://www.pierceye.com/news/345762/

相关文章:

  • 免费网站建设福州怎么修改网站主页
  • 深圳企业建站设计公司wordpress不显示样式
  • 外贸网站商城广东省建设协会网站
  • 杭州制作企业公司网站wordpress数据库添加用户
  • 主域名进入网站广告标识标牌制作厂家
  • 网站建设基础流程摘要专题网站建设策划
  • 滁州网站建设电话网站建设与网站优化
  • 慈溪做网站公司哪家好淘宝商城的网站建设
  • 安徽建设厅网站怎么打不开太原网络搭建
  • idea 网站开发最好的免费推广平台
  • 专业排名优化网站怎么建网站教程视频app
  • 全国八大员报名官方网站支付宝小程序开发工具
  • 怎么查看vps网站服务器时间中国建设会计协会网站
  • 门户网站上的广告怎么做深圳服装网站建设
  • 公司网站上线的通知抚州营销型网站建设
  • 中国住房城乡和城乡建设部网站小广告文案
  • 做带字头像的网站wordpress 翻页设置
  • 网站横幅js代码公众号如何申请
  • 找网站建设需要问什么软件物联网平台功能
  • 含山县城市建设有限公司网站成都中高风险地区名单最新
  • 鄂州手机网站建设深圳seo网站设计
  • 网站内容的实现方式建筑设计人才招聘
  • 网站做优化效果怎样iis怎么做网站空间
  • 重庆市建设局网站郑州网站建设哪一家好
  • wordpress指定分类广告金融网站排名优化
  • 美妆网站建设方案陕西网络公司网站建设
  • 北京地铁建设的网站深圳建网站兴田德润可信
  • 平台门户网站建设企业战略规划方案
  • 北京网站备案的地址住房和城乡建设部网站质保金
  • 网络营销自学网站腾讯云服务器cvm