对于优化,一般要多使用内部类,静态方法,少使用get set方法。对于listview列表的优化一般有如下两种方法:
1、若数据不多的时候,直接复用历史缓存,和静态的ViewHolder类。
1.1获得布局中的listview对象
lv_start_gps_info_collect=(ListView) findViewById(R.id.lv_start_gps_info_collect);
1.2一般listview都用BaseAdapter子类做数据适配器。
/**
* 终端GPS数据信息数据适配器
* @author yqq
*
*/
private class GpsDeviceInfoAdapter extends BaseAdapter{
List<TouristInfo> infos=null;
public GpsDeviceInfoAdapter(List<TouristInfo>infoTemp){
infos=infoTemp;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return infos.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return infos.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=null;
ViewHolder holder=null;
if(convertView!=null&&convertView instanceof LinearLayout ){
view=convertView;
holder=(ViewHolder)view.getTag();
}else{
holder=new ViewHolder();
view=View.inflate(EndDeviceOnGPS.this,R.layout.show_device_info_item,null);
holder.name=(TextView) view.findViewById(R.id.tv_device_name);
holder.addr=(TextView) view.findViewById(R.id.tv_device_mac_addr);
view.setTag(holder);
}
holder.name.setText("姓名:"+infos.get(position).getName());
holder.addr.setText("手机号码:"+infos.get(position).getPhoneNumber());
return view;
}
}
static class ViewHolder{
TextView name;
TextView addr;
}
其中 每项显示的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:background="@drawable/deceive_info_item_selector"
android:orientation="vertical" >
<LinearLayout
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/tv_device_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="设备名:"
android:textSize="20sp" />
<TextView
android:layout_marginTop="5dp"
android:id="@+id/tv_device_mac_addr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Mac地址:"
android:textColor="#000000"
android:textSize="18sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/holo_blue_bright" />
</LinearLayout>
</LinearLayout>
1.3通过异步任务来刷新数据实现在加载数据时候是一个进度提示,加载完毕后才显示数据的界面,类似微信的界面首次跳转效果;
/**
* 异步任务给列表加载数据
*/
private void fillData(){
new AsyncTask<Void,Void,Void>(){
@Override
protected void onPreExecute() {
loading.setVisibility(View.VISIBLE);
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
loading.setVisibility(View.INVISIBLE);
//刷新界面列表数据
if(mAdapter==null){
mAdapter=new RubishSmsInfosAdapter();
mRubishSms.setAdapter(mAdapter);
}else{
mAdapter.notifyDataSetChanged();
}
super.onPostExecute(result);
}
@Override
protected Void doInBackground(Void... params) {
if(mInfos==null){
mInfos=mRubishSmsInfoDao.findInfosbyPage(maxNum, offset);
}else{
mInfos.addAll(mRubishSmsInfoDao.findInfosbyPage(maxNum, offset));
}
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}.execute();
}
整体界面布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="100" >
<LinearLayout
android:layout_gravity="center"
android:id="@+id/ll_rublish_sms_info_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="invisible" >
<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="数据加载中,请稍后..."
android:textSize="13sp" />
</LinearLayout>
</FrameLayout>
<ListView
android:id="@+id/lv_rubish_sms_content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
2、列表展示数据太多,分页加载
public class RubishSmsActivity extends Activity {
private ListView mRubishSms;//显示垃圾短信的列表
private List<RubishSmsInfo> mInfos;//垃圾短信信息
private RubishSmsInfosAdapter mAdapter;//垃圾短信信息适配器
private int maxNum=5;//分页加载每页的最大数目
private int offset=0;//偏移
private int totalNums;//垃圾短信的总数目
private RubishSmsInfoDao mRubishSmsInfoDao;//垃圾短信信息的数据库表操作对象
private View loading;//数据加载提示
//private View m_view;//对垃圾短信的操作对话框布局
public RubishSmsActivity() {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
init();
setListener();
super.onCreate(savedInstanceState);
}
private void init() {
setContentView(R.layout.activity_rubish_sms);
mRubishSms=(ListView) findViewById(R.id.lv_rubish_sms_content);
mRubishSmsInfoDao=new RubishSmsInfoDao(getApplicationContext());
totalNums=mRubishSmsInfoDao.getMaxCount();
loading=findViewById(R.id.ll_rublish_sms_info_loading);
}
/**
* 设置监听事件
*/
private void setListener(){
//下拉列表的时候分页加载数据
mRubishSms.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
//在下拉列表空闲的时候显示数据
case OnScrollListener.SCROLL_STATE_IDLE:
//获得分页加载的每页最大值
int position=mRubishSms.getLastVisiblePosition();
int total=0;
if(mInfos!=null){
// total=maxNum;
total=mInfos.size();
}
if(position==total-1){
//到达该分页加载的末尾位置
offset+=maxNum;
if(offset>totalNums){
Toast.makeText(RubishSmsActivity.this,"数据已经加载完,没有更多的数据了...", 300).show();
return;
}
//异步任务加载数据
fillData();
}
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});
fillData();
//每个条目绑定监听
mRubishSms.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//获得条目对应的每个对象
Object object=mRubishSms.getItemAtPosition(position);
if(object instanceof RubishSmsInfo){
final RubishSmsInfo info=(RubishSmsInfo) object;
View m_view=View.inflate(RubishSmsActivity.this,R.layout.show_rubish_sms_operation,null);
//对对象的操作1、删除2、恢复到收件箱3、加入黑名单
Dialog builder=new Dialog(RubishSmsActivity.this);
builder.setTitle("提示");
builder.setContentView(m_view);
//删除
((TextView)m_view.findViewById(R.id.tv_delete)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(mInfos==null||!mInfos.contains(info)){
Toast.makeText(RubishSmsActivity.this,"没有数据!",200).show();
return;
}
mInfos.remove(info);
if(mRubishSmsInfoDao==null){
mRubishSmsInfoDao=new RubishSmsInfoDao(getApplicationContext());
}
mRubishSmsInfoDao.deleteSmsInfos(info);
if(mAdapter==null){
mAdapter=new RubishSmsInfosAdapter();
mRubishSms.setAdapter(mAdapter);
}else{
mAdapter.notifyDataSetChanged();
}
}
});
//恢复到收件箱
((TextView)m_view.findViewById(R.id.tv_recovery_sms)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//刷新界面
if(mInfos==null||!mInfos.contains(info)){
Toast.makeText(getApplicationContext(),"没有数据了!",300).show();
return;
}
new AsyncTask<Void,Void,Void>(){
boolean flag=false;
@Override
protected Void doInBackground(Void... params) {
SmsInboxProvider provider=new SmsInboxProvider(getApplicationContext());
flag=provider.recoverySmsToInbox(info);
return null;
}
@Override
protected void onPostExecute(Void result) {
if(flag){
Toast.makeText(getApplicationContext(),"恢复到收件箱成功!",300).show();
mInfos.remove(info);
if(mRubishSmsInfoDao==null){
mRubishSmsInfoDao=new RubishSmsInfoDao(getApplicationContext());
}
mRubishSmsInfoDao.deleteSmsInfos(info);
if(mAdapter==null){
mAdapter=new RubishSmsInfosAdapter();
mRubishSms.setAdapter(mAdapter);
}else{
mAdapter.notifyDataSetChanged();
}
}else{
Toast.makeText(getApplicationContext(),"恢复到收件箱失败!",300).show();
}
super.onPostExecute(result);
}
}.execute();
}
});
//加入黑名单
((TextView)m_view.findViewById(R.id.tv_add_black_number)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//异步任务把黑名单添加到黑名单数据表里
new AsyncTask<Void,Void,Void>(){
boolean flag=false;
@Override
protected Void doInBackground(Void... params) {
BlackNumberDao blackNumberDao=new BlackNumberDao(getApplicationContext());
flag=blackNumberDao.addBlackNumber(info.getPhoneNumber());
return null;
}
@Override
protected void onPostExecute(Void result) {
if(flag==true){
Toast.makeText(RubishSmsActivity.this,"添加黑名单成功!",300).show();
}else{
Toast.makeText(RubishSmsActivity.this,"已经添加到黑名单!",300).show();
}
super.onPostExecute(result);
}
}.execute();
}
});
builder.show();
}
}
});
}
/**
* 异步任务给列表加载数据
*/
private void fillData(){
new AsyncTask<Void,Void,Void>(){
@Override
protected void onPreExecute() {
loading.setVisibility(View.VISIBLE);
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
loading.setVisibility(View.INVISIBLE);
//刷新界面列表数据
if(mAdapter==null){
mAdapter=new RubishSmsInfosAdapter();
mRubishSms.setAdapter(mAdapter);
}else{
mAdapter.notifyDataSetChanged();
}
super.onPostExecute(result);
}
@Override
protected Void doInBackground(Void... params) {
if(mInfos==null){
mInfos=mRubishSmsInfoDao.findInfosbyPage(maxNum, offset);
}else{
mInfos.addAll(mRubishSmsInfoDao.findInfosbyPage(maxNum, offset));
}
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}.execute();
}
/**
* 垃圾短信显示的数据适配器
* @author yqq
*
*/
private class RubishSmsInfosAdapter extends BaseAdapter{
@Override
public int getCount() {
return mInfos.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mInfos.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=null;
ViewHolder holder=null;
if(convertView!=null&& convertView instanceof LinearLayout){
view=convertView;
holder=(ViewHolder) view.getTag();
}else{
holder=new ViewHolder();
view=View.inflate(RubishSmsActivity.this,R.layout.rubish_sms_info_item,null);
holder.tvPhoneNumber=(TextView) view.findViewById(R.id.tv_phone_number);
//holder.tvDate=(TextView) view.findViewById(R.id.tv_received_date);
holder.tvContent=(TextView) view.findViewById(R.id.tv_rubish_sms_content);
view.setTag(holder);
}
holder.tvPhoneNumber.setText("电话号码:"+mInfos.get(position).getPhoneNumber());
//holder.tvDate.setText(mInfos.get(position).getReceivedDate());
holder.tvContent.setText("短信内容:"+mInfos.get(position).getSmsContent());
return view;
}
}
static class ViewHolder{
TextView tvPhoneNumber;//电话号码显示
//TextView tvDate;//日期显示
TextView tvContent;//短信内容显示
}
}