zoukankan      html  css  js  c++  java
  • 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优化的时候我体会到了代码的文艺,虽然多创建了一个类,但是关联起来减少了寻址的次数,类似于数据结构中学习的哈希表。

     

  • 相关阅读:
    每日编程-20170322
    每日编程-20170321
    C++primer拾遗(第七章:类)
    每日编程-20170320
    uniApp之 顶部选项卡
    vue 服务端渲染 vs 预渲染(1)
    uni-app学习笔记
    如何解决vue跨域的问题
    简单整理数组的用法
    vue-cli
  • 原文地址:https://www.cnblogs.com/suanai/p/12284253.html
Copyright © 2011-2022 走看看