BaseAdapter基础操作

今天学习使用BaseAdapter
BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:
public int getCount(): 适配器中数据集的数据个数;
public Object getItem(int position): 获取数据集中与索引对应的数据项;
public long getItemId(int position): 获取指定行对应的ID;
public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。
基本流程:
总结一下用ViewHolder优化BaseAdapter的整体步骤:

1 创建bean对象,用于封装数据;
2 在构造方法中初始化的数据List;
3 创建ViewHolder类,创建布局映射关系;
4 判断convertView,为空则创建,并设置tag,不为空则通过tag取出ViewHolder;
5 给ViewHolder的控件设置数据。
由于是看着视频学习的,老师给我们讲解了三种baseAdapter的使用方法
首先是逗比式:
public View getView(int position, View convertView, ViewGroup parent) {
//将布局文件转化为View对象
View view = mInflater.inflate(R.layout.item,null);

    /**
     * 找到item布局文件中对应的控件 
     */
    ImageView imageView = (ImageView) view.findViewById(R.id.iv_image);
    TextView titleTextView = (TextView) view.findViewById(R.id.tv_title);
    TextView contentTextView = (TextView) view.findViewById(R.id.tv_content);

    //获取相应索引的ItemBean对象
    ItemBean bean = mList.get(position);

    /**
     * 设置控件的对应属性值 
     */
    imageView.setImageResource(bean.itemImageResId);
    titleTextView.setText(bean.itemTitle);
    contentTextView.setText(bean.itemContent);

    return view;
}

这种方式每次调用getView时都是通过inflate创建一个新的View对象,然后在此view中通过findViewById找到对应的控件,完全没有利用到ListView的缓存机制。所以为逗比式
第二种,普通式:

public View getView(int position, View convertView, ViewGroup parent) {//如果view未被实例化过,缓存池中没有对应的缓存
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item,null);
        }
        /**
         * 找到item布局文件中对应的控件
         */
        ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_image);
        TextView titleTextView = (TextView) convertView.findViewById(R.id.tv_title);
        TextView contentTextView = (TextView) convertView.findViewById(R.id.tv_content);

        //获取相应索引的ItemBean对象
        ItemBean bean = mList.get(position);
        /**
         * 设置控件的对应属性值
         */
        imageView.setImageResource(bean.itemImageResId);
        titleTextView.setText(bean.itemTitle);
        contentTextView.setText(bean.itemContent);
        return convertView;
    }

此方式充分使用了ListView的缓存机制,如果view没有缓存才创建新的view,效率相比于逗比式提升了很多。但是,当ListView很复杂时,每次调用findViewById都会去遍历视图树,所以findViewById是很消耗时间的,我们应该尽量避免使用findViewById来达到进一步优化的目的。于是就有了第三种,也是最常见的最应使用的一种
第三种,文艺式

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    //如果view未被实例化过,缓存池中没有对应的缓存
    if (convertView == null) {
        viewHolder = new ViewHolder();
            // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
            convertView = mInflater.inflate(R.layout.item, null);
    
            //对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_conte

nt);

        //通过setTag将convertView与viewHolder关联
        convertView.setTag(viewHolder);
    }else{//如果缓存池中有对应的view缓存,则直接通过getTag取出viewHolder
        viewHolder = (ViewHolder) convertView.getTag();
    }
    // 取出bean对象
    ItemBean bean = mList.get(position);

    // 设置控件的数据
    viewHolder.imageView.setImageResource(bean.itemImageResId);
    viewHolder.title.setText(bean.itemTitle);
    viewHolder.content.setText(bean.itemContent);

    return convertView;
}
// ViewHolder用于缓存控件,三个属性分别对应item布局文件的三个控件
class ViewHolder{
    public ImageView imageView;
    public TextView title;
    public TextView content;
}

此方式不仅利用了ListView的缓存机制,而且使用ViewHolder类来实现显示数据视图的缓存,避免多次调用findViewById来寻找控件,以达到优化程序的目的。

package com.example.test;

import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
MySQLiteHelper helper;
ListView listview;
int count=0;
public  static  final  String TAG ="ZZA";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        String data = "AWQAWEAEQAWQAWQWAWQAWQ";

        final String[] da = data.split("A");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (helper == null) {
            helper = new MySQLiteHelper(this);
        }
        findViewById(R.id.tianjia).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        for(int i=1;i<da.length&&i%3==0;i++) {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues values = new ContentValues();
            String time = String.valueOf(System.currentTimeMillis());
    String name = da[i];
    String buy = da[i+1];
    int money = Integer.parseInt("20");
    values.put("_id", ++count);
    values.put("name", name);
    values.put("buy", buy);
    values.put("money", money);
    values.put("time", time);
    db.insert("zza", null, values);
        Log.i(TAG, "-----------into:------ ");
    }
                }
            });
            findViewById(R.id.chaxun).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    List<bean> list = new ArrayList<>();
                    SQLiteDatabase db = helper.getWritableDatabase();
                    String sql = "select * from zza";
                    Cursor cursor = db.rawQuery(sql, null);
                    while (cursor.moveToNext()) {
                        String buy = cursor.getString(cursor.getColumnIndex("buy"));
                        String time = cursor.getString(cursor.getColumnIndex("time"));
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        int money = cursor.getInt(cursor.getColumnIndex("money"));
    
                        list.add( new bean(name, buy, money, time));
                        listview.setAdapter(new base(getApplicationContext(), list));
                        break;
                    }
                }
            });
            findViewById(R

.id.del).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder2 = new AlertDialog.Builder(getApplicationContext());
                View view_d = View.inflate(getApplicationContext(), R.layout.shanchu, null);
                final EditText delete = view_d.findViewById(R.id.delete);
                builder2.setTitle("删除数据").setPositiveButton("确认", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        SQLiteDatabase db = helper.getWritableDatabase();
                        db.delete("zza", delete.getText().toString(), null);
                        ;
                        Toast.makeText(getApplicationContext(), "删除数据成功", Toast.LENGTH_SHORT).show();


                    }
                });

                builder2.show();}
        });


    }}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值