Android开发之记账本开发第一天
一、目标
今天是记账本开发的第一天,为了方便之后的开发今天要学习掌握数据适配器BaseAdaptor的使用,并且练习学会BaseAdaptor的三种使用方式。
二、具体内容
ViewHolder优化BaseAdaptor的方式:
(1)创建Bean对象封装数据
(2)在构造方法中初始化用于映射的数据List
(3)创建内部ViewHolder类,创建布局映射关系
(4)判断convertView是否为空,为空则创建并设置tag关联viewHolder,不为空则通过tag来取出viewHolder
(5)给viewHolder中的控件设置数据
三、源代码
package com.example.baseadapter; import android.os.Bundle; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.Adapter; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List<itemBean> ItemBeanList=new ArrayList<>(); for(int i=0;i<20;i++){ ItemBeanList.add(new itemBean( R.mipmap.ic_launcher, "标题"+i, "内容"+i )); } ListView listView=findViewById(R.id.lv_main); listView.setAdapter(new MyAdapater(this,ItemBeanList)); } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="wrap_content" android:src="@mipmap/ic_launcher" android:id="@+id/iv_image" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_height="wrap_content"/> <TextView android:layout_width="match_parent" android:text="标题" android:textSize="30sp" android:id="@+id/tv_title" android:layout_toRightOf="@id/iv_image" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:gravity="center_horizontal" android:layout_height="wrap_content"/> <TextView android:layout_width="match_parent" android:text="Content" android:id="@+id/tv_content" android:textSize="20sp" android:layout_toRightOf="@id/iv_image" android:layout_below="@id/tv_title" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_height="wrap_content"/> </RelativeLayout>
package com.example.baseadapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; public class MyAdapater extends BaseAdapter { private List<itemBean> mList; private LayoutInflater mInflater; public MyAdapater(Context context, List<itemBean> itemBeanList) { mList = itemBeanList; mInflater = LayoutInflater.from(context); } @Override //返回适配器中数据集中数据的个数 public int getCount() { return mList.size(); } @Override //获取数据集中与指定索引对应的数据项 public Object getItem(int position) { return mList.get(position); } @Override //获取指定行对应的ID public long getItemId(int position) { return position; } @Override //获取每个Item的显示内容 public View getView(int position, View convertView, ViewGroup parent) { //*****************逗比式*****************************↓ //没有任何的优化处理,每次都新建一个view,效率低下 /*View view = mInflater.inflate(R.layout.item_layout, null);//第一个参数,需要装载到item中的布局文件;第二个参数,一般填null ImageView imageView = view.findViewById(R.id.iv_image); TextView title = view.findViewById(R.id.tv_title); TextView content=view.findViewById(R.id.tv_content); itemBean bean=mList.get(position); imageView.setImageResource(bean.ItemImageReId); title.setText(bean.ItemTitle); content.setText(bean.ItemContent); return view;*/ //*****************逗比式*****************************↑ //*****************普通式*****************************↓ //大量的findViewById耗费时间 /*if(convertView==null){//为空,缓冲池里没有缓存,避免了重复创建 convertView=mInflater.inflate(R.layout.item_layout,null); } ImageView imageView = convertView.findViewById(R.id.iv_image); TextView title = convertView.findViewById(R.id.tv_title); TextView content=convertView.findViewById(R.id.tv_content); itemBean bean=mList.get(position); imageView.setImageResource(bean.ItemImageReId); title.setText(bean.ItemTitle); content.setText(bean.ItemContent); return convertView;*/ //*****************普通式*****************************↑ //*****************文艺式*****************************↓ //不仅利用了缓存,并且通过ViewHolder类来减少了FindViewById在时间上的浪费 ViewHolder viewHolder; if(convertView==null){//为空,缓冲池里没有缓存 viewHolder=new ViewHolder(); convertView=mInflater.inflate(R.layout.item_layout,null); viewHolder.imageView=convertView.findViewById(R.id.iv_image); viewHolder.title=convertView.findViewById(R.id.tv_title); viewHolder.content=convertView.findViewById(R.id.tv_content); convertView.setTag(viewHolder); //通过setTag将ViewHolder与ConvertView关联 } else { viewHolder = (ViewHolder) convertView.getTag(); itemBean bean=mList.get(position); viewHolder.imageView.setImageResource(bean.ItemImageReId); viewHolder.title.setText(bean.ItemTitle); viewHolder.content.setText(bean.ItemContent); } return convertView; //*****************文艺式*****************************↑ } //创建内部类ViewHolder class ViewHolder{ public ImageView imageView; public TextView title; public TextView content; } }
package com.example.baseadapter; public class itemBean { public int ItemImageReId; public String ItemTitle; public String ItemContent; public itemBean(int itemImageReId, String itemTitle, String itemContent) { ItemImageReId = itemImageReId; ItemTitle = itemTitle; ItemContent = itemContent; } }
四、心得体会
今天学的baseAdaptor用于ListView当中,可以用作账本展示时候的容器,为账本的开发做准备。并且在学习viewHolder优化的时候我体会到了代码的文艺,虽然多创建了一个类,但是关联起来减少了寻址的次数,类似于数据结构中学习的哈希表。