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));
    }

}
MainActivity
<?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>
item_layout
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;
    }

}
MyAdapter
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;
    }

}
item_bean

 

四、心得体会

今天学的baseAdaptor用于ListView当中,可以用作账本展示时候的容器,为账本的开发做准备。并且在学习viewHolder优化的时候我体会到了代码的文艺,虽然多创建了一个类,但是关联起来减少了寻址的次数,类似于数据结构中学习的哈希表。

 

 

posted @ 2020-02-08 18:02  酸奶面包  阅读(367)  评论(0编辑  收藏  举报