(一)BaseAdapter的三种表达式:

①逗比式:

public View getView(int position, View convertView, ViewGroup parent) {

        //逗比式
View view=minflater.inflate(R.layout.item,null);
ImageView imageView=(ImageView) view.findViewById(R.id.iv_image);
TextView title=(TextView) view.findViewById(R.id.tv_title);
TextView content=(TextView) view.findViewById(R.id.tv_content);
ItemBean bean=mlist.get(position);
imageView.setImageResource(bean.imageid);
title.setText(bean.title);
content.setText(bean.content);
return view;
}

每进行一次getView就要利用inflater对象去创建一个新的view,并在View中找到相应的控件并给他设置相应的值,这样完全没有利用到ListView的缓存机制,因此称为“逗比式”。

②普通式

既然“逗比式”没有利用到缓存机制,那么我们的普通式就要好好利用。

如何利用?我们需要判断一下convertview是否已经缓存过,如果没有缓存过就创建一个view。如下面的代码:

//普通式
if(convertView==null)
{
convertView=minflater.inflate(R.layout.item,null);
}
ImageView imageView=(ImageView) convertView.findViewById(R.id.iv_image);
TextView title=(TextView) convertView.findViewById(R.id.tv_title);
TextView content=(TextView) convertView.findViewById(R.id.tv_content);
ItemBean bean=mlist.get(position);
imageView.setImageResource(bean.imageid);
title.setText(bean.title);
content.setText(bean.content);
return convertView;
}

他虽然对缓存资源进行了合理的利用,但是还是存在一些问题,不够优化,每次都要去布局中需找部件,findviewbyid是很耗费时间的,这样在小程序中可能体现不出什么,但是总归是耗费时间的,因此我们要对其进行优化。

③文艺式:

在文艺式中我们需要为findviewbyid进行优化,

 //文艺式
/*利用ViewHolder优化BaseAdapter思路:
1.创建Bean对象,用于封装数据
2.在构造方法中初始化用于映射的数据List
3.创建ViewHolder类,创建布局映射关系
4.判断convertView,为空则创建,并设置tag;否则通过tag来取出viewholder
5.给viewholder中的空间设置数据*/ ViewHolder viewHolder;
if(convertView==null){
convertView=minflater.inflate(R.layout.item,null);
viewHolder=new ViewHolder();
viewHolder.imageView=(ImageView)convertView.findViewById(R.id.iv_image);
viewHolder.title=(TextView)convertView.findViewById(R.id.tv_title);
viewHolder.content=(TextView)convertView.findViewById(R.id.tv_content);
convertView.setTag(viewHolder);
}else{
viewHolder=(ViewHolder) convertView.getTag();
}
ItemBean bean=mlist.get(position);
viewHolder.imageView.setImageResource(bean.imageid);
viewHolder.title.setText(bean.title);
viewHolder.content.setText(bean.content);
return convertView;
}
class ViewHolder{
public ImageView imageView;
public TextView title;
public TextView content;
}

(二)startActivityForResult的应用

startActivityForResult startActivityForResult(Intent intent, int requestCode)。这个方法我一般用来在ActivityA中启动另个activityB。当返回的时候需要携带来自B的数据。ActivityA更新界面。
1.首先要在activityA中启动startActivityForResult(Intent intent, int requestCode)

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,HeadActivity.class);
startActivityForResult(intent,0x11);
}
});

参数1.就是一个intent 你可以携带一些数据。当然也可以不携带

参数2.requescode,你自定义的一个int类型的数值(一般>0);

2.还有一个方法。这个方法是在ActivityB中使用的,主要一定要在finish()之前调用该方法,不然不起作用

setResult(int resultCode, Intent data)

 gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent=getIntent();
Bundle bundle=new Bundle();
bundle.putInt("imageId",imageId[position]);
intent.putExtras(bundle);
setResult(0x11,intent);
finish();
}
});

同样还是两个参数,

参数1:resultcode,先说作用。这个参数有两个作用。第一个可以用来判断有没有返回成功。还有一个作用同样可以判断是从哪个activity返回来的

为什么呢。这个参数可以自定义。如果返回成功了,当时你在activityB中定义的什么,那么 在

onActivityResult(int requestCode, int resultCode, Intent data)这个方法中就会接收到什么。所以可以用来判断来这哪个activity。 如果失败了(比如你在ActivityB中直接按了返回键。什么都没有操作),这种情况在ActivityA中接收到的requestcode 就是0. 所以这个参数我一般用来判断是否返回成功。

3.最后在ActivityA中onActivityResult(int requestCode, int resultCode, Intent data)中接收数据,并判断requestCode和resultCode是不是你想要的,然后进行取值。

一个案例:进行头像的切换

点击切换头像,到另一个页面

选好后,就会自动回到上个页面并且头像切换成功

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/beijing"
android:paddingTop="40dp"
android:orientation="vertical" > <ImageView
android:id="@+id/t_image"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/touxiang" /> <Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:text="选择头像"
/> </LinearLayout>

activity_head.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".HeadActivity">
<GridView
android:id="@+id/gridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:horizontalSpacing="3dp"
android:verticalSpacing="3dp"
android:numColumns="4">
</GridView>
</RelativeLayout>

MainActivity.java

package com.example.startactivityforresult;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn=(Button)findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,HeadActivity.class);
startActivityForResult(intent,0x11);
}
});
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0x11 && resultCode==0x11)
{
Bundle bundle=data.getExtras();
int image=bundle.getInt("imageId");
int k=bundle.getInt("word");
imageView=(ImageView)findViewById(R.id.t_image);
imageView.setImageResource(image);
}
}
}

HeadActivity.java

package com.example.startactivityforresult;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast; public class HeadActivity extends AppCompatActivity {
public int[] imageId = new int[]{R.drawable.touxiang1, R.drawable.touxiang2,
R.drawable.touxiang3, R.drawable.touxiang4, R.drawable.touxiang5
}; // 定义并初始化保存头像id的数组 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_head);
GridView gridView=(GridView)findViewById(R.id.gridView);
BaseAdapter baseAdapter=new BaseAdapter() { @Override
public int getCount() {
return imageId.length;
} @Override
public Object getItem(int position) {
return position;
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if(convertView==null){
imageView=new ImageView(HeadActivity.this);
imageView.setAdjustViewBounds(true);
imageView.setMaxHeight(158);
imageView.setMaxWidth(150);
imageView.setPadding(5, 5, 5, 5);
}else{
imageView=(ImageView)convertView;
}
imageView.setImageResource(imageId[position]);
return imageView;
}
};
gridView.setAdapter(baseAdapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent=getIntent();
Bundle bundle=new Bundle();
bundle.putInt("imageId",imageId[position]);
intent.putExtras(bundle);
setResult(0x11,intent);
finish();
}
});
}
}

BaseAdapter的三种表达式分析,startActivityForResult的使用的更多相关文章

  1. LwIP协议栈开发嵌入式网络的三种方法分析

    LwIP协议栈开发嵌入式网络的三种方法分析   摘要  轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中.本文结合μC/OS-II这一实时操作系统,以 ...

  2. VMWARE虚拟机无法访问的三种方法分析

    bridged(桥接模式). NAT(网络地址转换模式) host-only(主机模式). 理论认识: 1.bridged(桥接模式) 在这个地方模式.虚拟机等同于网络内的一台物理主机,可对手动设置I ...

  3. Apache Prefork、Worker和Event三种MPM分析

    三种MPM介绍 Apache 2.X  支持插入式并行处理模块,称为多路处理模块(MPM).在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到 ...

  4. 转载:VMWARE虚拟机无法访问的三种方法分析

    bridged(桥接模式).NAT(网络地址转换模式)host-only(主机模式).理论认识:1.bridged(桥接模式)在这个地方模式.虚拟机等同于网络内的一台物理主机,可对手动设置IP,子网掩 ...

  5. STM32中AD采样的三种方法分析

    在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式.三种方法按照处理复杂方法DMA模式处理模式效率最高 ...

  6. mysq表的三种关系,数据的增删改以及单表多表查询

    一丶三种关系 分析步骤: #.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #.再站在右表的角度去找 ...

  7. c#之冒泡排序的三种实现和性能分析

    冒泡排序算法是我们经常见到的尤其是子一些笔试题中. 下面和大家讨论c#中的冒泡排序,笔者提供了三种解决方案,并且会分析各自的性能优劣. 第一种估计大家都掌握的,使用数据交换来实现,这种就不多说了,园子 ...

  8. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  9. Tomcat内存溢出的三种情况及解决办法分析

    Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一样的,当然处理方式也不一样. 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三种 ...

随机推荐

  1. Python 元类的基本介绍及使用

    一.什么是元类 二.如何使用元类 (一)不依赖class关键字创建一个自定义类 (二)自定义元类控制类的产生 (三)自定义元类控制类的调用 一.什么是元类 在python中,一切皆对象,而对象都是由类 ...

  2. 洛谷$P4249\ [WC2007]$剪刀石头布 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 题目大意其实就说有一个$n$个节点的有向完全图,然后部分边的方向已经给定了,要求确定所有边的方向使三元环数目有$max$.这里三元环的定义是说三条边的方向一 ...

  3. DRF 08

    目录 三大认证 流程 认证组件 权限组件 频率组件 自定义token的签发 三大认证 流程 由于DRF中, 所有的视图类都要直接和间接继承APIView类, 也只有APIView类中才有dispatc ...

  4. echarts在一个折线/柱状图浮窗显示多条数据

    解决问题就在data里面,首先 data里面是可以json数组形式,如官方API上的 name:”“, value:”“,等 value是echart识别折线图的key值.1.来看数据格式 data: ...

  5. 1046 划拳 (15 分)C语言

    划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒.两人同赢或两人同输 ...

  6. CentOS7.2 部署Ceph分布式存储

    1.1 环境准备 主机名 IP地址 ceph-admin 192.168.16.220 ceph-node1,ceph-mon 192.168.16.221 ceph-node2,ceph-mon 1 ...

  7. sparkstreaming消费kafka后bulk到es

    不使用es-hadoop的saveToES,与scala版本冲突问题太多.不使用bulkprocessor,异步提交,es容易oom,速度反而不快.使用BulkRequestBuilder同步提交. ...

  8. js以当前时间为基础,便捷获取时间(最近2天,最近1周,最近2周,最近1月,最近2月,最近半年,最近一年,本周,本月,本年)

    在开发公司管理后台系统时,遇到了需要根据不同的时间段如"近一年.近半年.近三月.近一月.近一周"来获取并展示不同图表数据的需求,很是繁琐,项目开发周期又非常的短,自己想了一下,虽然 ...

  9. Yolo V3理解bbox和label的关系

    假如一个bbox坐标为:[35 220 62 293 3] 第一步:将bbox转换为中心坐标和宽高形式(3种缩放比例进行缩放) 那么onehot:[0 0 0 1 0 0 0 0 0 0 ...... ...

  10. springboot2 + grpc + k8s + istio

    项目情况说明: ubuntu - 16.04 springboot - 2.2.2.RELEASE mysql - 5.7 mongodb - 4.0.14 redis - 3.0.6 grpc -  ...