今天学习使用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();}
});
}}