android listView的优化方法

来源:互联网 发布:知乎怎么匿名回答 编辑:程序博客网 时间:2024/06/16 00:36

对于优化,一般要多使用内部类,静态方法,少使用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(maxNumoffset);

}else{

mInfos.addAll(mRubishSmsInfoDao.findInfosbyPage(maxNumoffset));

}

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(maxNumoffset);

}else{

mInfos.addAll(mRubishSmsInfoDao.findInfosbyPage(maxNumoffset));

}

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;//短信内容显示

}

 

}



0 0
原创粉丝点击