码迷,mamicode.com
首页 > 其他好文 > 详细

关于ListView的优化

时间:2015-04-13 22:34:55      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

  ListView是Android开发中非常常用的组件。不论是内容还是设置,只要是同格式的非单一的内容,都需要使用ListView。

  ListView中有很多奇巧,最最简单的就是SimpleAdapter。就要显示的内容与布局中的组件一一对应。

  SimpleAdapter是一个适配器,通过它开发者设置ListView的Item布局中的组件与数据之前的对应关系,可以形成包含了ImageView和TextView的Item。

  关于这个的用法,可以参考fooCoder的博客:http://www.cnblogs.com/noTice520/archive/2011/12/05/2276379.html

  但是,有时候,我们的需求会比较复杂。比如,我们可能会需要在Item中有一个Button。如果,继续用上面的方法,Button是没有办法获得焦点的,我们的点击只会触发ListView的Item的点击事件,不会触发Button的点击事件。另外,当我们需要显示非常多的Item时,ListView会试图一次将所有的Item都显示出来,这样的做法会给系统带来相当大的负担,甚至有可能导致OOM。此时,我们就需要使用BaseAdapter来生成ListView。当我们自己建的Adapter继承BaseAdapter时,我们需要实现几个方法。  

        @Override
        public int getCount() {
            return adapterObjectList.size() ;
        }
        @Override
        public Object getItem(int position) {
            return null;
        }
        @Override
        public long getItemId(int position) {
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
     }

  关于BaseAdapter的用法,我们同样可以参考上面的链接http://www.cnblogs.com/noTice520/archive/2011/12/05/2276379.html

  但是,这终归是比较麻烦的。因为一个ListView的显示代码将会非常的长,如果要修改其中的布局,也是非常的麻烦。原理既然已经有大大写这里了,我在这里就做了一个不成熟的父类,将时常需要变更的代码与不常变更的代码分开,方便使用。代码如下:

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import java.util.List;

/**
 * Created by Administrator on 2015/4/4.
 */
public abstract class EasyListView extends ListView {
    public EasyListView(Context context) {
        super(context);
    }
    public EasyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public EasyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    Context mContext;
    int mItemLayoutId;
    EasyListView mSonListView;

    /**
     * 获得ListView的Item中的布局文件的Id
     * @return  mItemLayoutId
     */
    protected abstract int getListViewItemLayoutId();
    /**
     * 获取Item中组件的Id
     * @param convertView Item所在的View
     */
    protected abstract void getViewId(View convertView);
    /**
     * 更新Item中的组件
     */
    protected abstract void updateView(Object dataObject);

    /**
     * 更新ListView界面
     * @param context   上下文
     * @param inputDataList 获取信息
     */
    public abstract void updateListView(Context context , List<?> inputDataList);
protected MyAdapter getAdapter(Context context ,List<?> dataList ,EasyListView sonListView){ mContext = context; mSonListView = sonListView; mItemLayoutId = mSonListView.getListViewItemLayoutId(); MyAdapter myAdapter = new MyAdapter(context , dataList); return myAdapter; }
//List的适配器 protected class MyAdapter extends BaseAdapter { Context adapterContext; private LayoutInflater adapterInflater;//得到一个LayoutInfalter对象用来导入布局 private List<?> adapterObjectList; public MyAdapter(Context myContext , List<?> inputDataList){ adapterContext = myContext; adapterInflater = LayoutInflater.from(myContext); adapterObjectList=inputDataList; } @Override public int getCount() { return adapterObjectList.size() ; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if(convertView == null){ //引入list每项的布局 convertView = adapterInflater.inflate(mItemLayoutId,null); viewHolder = new ViewHolder(adapterContext); viewHolder.viewGetViewId(convertView); convertView.setTag(viewHolder); } else{ viewHolder= (ViewHolder) convertView.getTag(); } viewHolder.viewUpdateView(adapterObjectList.get(position)); return convertView; } public final class ViewHolder { Context viewContext; public ViewHolder(Context context) { viewContext = context; } public void viewGetViewId(View convertView) { //将申明的组件与布局连接 mSonListView.getViewId(convertView); } public void viewUpdateView( Object adapterObject) { //给特定的View赋值 mSonListView.updateView(adapterObject); } } } }

  基本照抄fooCoder大大的方法,不作赘述。需要说明的是,这是一个抽象类,当我们要新建一个ListView时,我们只需要自己定义一个类,继承它,然后按一定的规则实现方法即可。使用的例子如下:

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import com.memeda.lsy.tomatofight3.R;
import com.memeda.lsy.tomatofight3.data.RecordingData;
import java.util.List;

/**
 * Created by Administrator on 2015/4/4.
 */
public class DownLoadingListView extends EasyListView {
    public DownLoadingListView(Context context) {
        super(context);
    }

    public DownLoadingListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DownLoadingListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
TextView titleTextView , pathTextView; @Override
protected int getListViewItemLayoutId() { return R.layout.download_listview_item_layout; } @Override protected void getViewId(View convertView) { titleTextView = (TextView) convertView.findViewById(R.id.downloadAmrTitle); pathTextView = (TextView) convertView.findViewById(R.id.downloadAmrAuthor); } @Override protected void updateView(Object dataObject) { RecordingData recordingData = (RecordingData) dataObject; titleTextView.setText(recordingData.getRecordingName()); pathTextView.setText("作者:"+recordingData.getUserName()); } @Override public void updateListView(Context context, List<?> inputDataList) { MyAdapter myAdapter = getAdapter(context , inputDataList , this); setAdapter(myAdapter); } }

  使用步骤如下:

  一、声明Item中的组件。  

TextView titleTextView , pathTextView;

  二、获得ListView的Item的布局文件(XML)。

@Override
    protected int getListViewItemLayoutId() {
        return R.layout.download_listview_item_layout;
    }

  三、获得Item中的组件的实例。

@Override
    protected void getViewId(View convertView) {
        titleTextView = (TextView) convertView.findViewById(R.id.downloadAmrTitle);
        pathTextView = (TextView) convertView.findViewById(R.id.downloadAmrAuthor);
    }

  四、设置ListView的生成/更新时,数据与组件显示的对应关系。  

@Override
    protected void updateView(Object dataObject) {
        RecordingData recordingData = (RecordingData) dataObject;
        titleTextView.setText(recordingData.getRecordingName());
        pathTextView.setText("作者:"+recordingData.getUserName());
    }

  五、实现ListView的更新方法。 

@Override
    public void updateListView(Context context, List<?> inputDataList) {
        MyAdapter myAdapter = getAdapter(context , inputDataList , this);
        setAdapter(myAdapter);
    } 

  六、在Activity中使用它,像通常的ListView一样

internetRecordListView.updateListView(this,recordingDatas);

以上。

 

  

关于ListView的优化

标签:

原文地址:http://www.cnblogs.com/fishbone-lsy/p/4423360.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!