ListView的优化

我们来一下如下代码:

package whu.cn.whushare.ui.main.known.adapter;

import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.androidplus.util.ViewMapping;
import com.androidplus.util.ViewMappingUtil;

import java.util.List;

import whu.cn.whushare.R;
import whu.cn.whushare.bean.User;
import whu.cn.whushare.common.ImageWorkerManager;
import whu.cn.whushare.ui.main.known.bean.AllQuestion;
import whu.cn.whushare.util.Utils;

public class AllQuestionListAdapter extends BaseAdapter {
    private List<AllQuestion> questions; // 数据

    private Context context;

    /**
     *
     * @param context
     *            mainActivity
     * @param questions
     *            显示的数据
     */
    public AllQuestionListAdapter(Context context, List<AllQuestion> questions) {
        this.context = context;
        this.questions = questions;

    }

    /*
     * 获得数据总数
     */
    @Override
    public int getCount() {
        return questions.size();
    }

    /*
     * 根据索引为position的数据
     */
    @Override
    public Object getItem(int position) {
        return questions.get(position);
    }

    /*
     * 根据索引值获得Item的Id
     */
    @Override
    public long getItemId(int position) {
        return position;
    }

    /*
     * 通过索引值position将数据映射到视图convertView具有缓存功能,在第一页时为null,在第二第三....页时不为null
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.layout_question_all_item, null);
            viewHolder = new ViewHolder();
            ViewMappingUtil.mapView(viewHolder, convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        AllQuestion all_question = questions.get(position);
        viewHolder.questionName.setText(all_question.getQuestion().getQuestionName() );
        viewHolder.answer_question_count.setText("回答:"+all_question.getAnswerNum()+ "");
        viewHolder.answer_time.setText(all_question.getLastModifyTime() + "");
        viewHolder.attentionNum.setText("关注:"+all_question.getAttentionNum()+"");
        User user = all_question.getQuestionUser();

        viewHolder.userName.setText(user.getNickName());
        if (!TextUtils.isEmpty(user.getAvatar())) {
            ImageWorkerManager.getInstance(context).loadCommonImage(Utils.getPhotoUrl(user.getAvatar()),
                    viewHolder.avatar, R.drawable.avatar, R.drawable.avatar);
        }
        return convertView;
    }

    class ViewHolder {
        @ViewMapping(id = R.id.question)
        private TextView questionName;
        @ViewMapping(id = R.id.answer_count)
        private TextView answer_question_count;
        @ViewMapping(id = R.id.end_time)
        private TextView answer_time;
        @ViewMapping(id = R.id.user_avatar)
        private ImageView avatar;
        @ViewMapping(id = R.id.other_user_name1)
        private TextView userName;
        @ViewMapping(id=R.id.attention_num)
        private TextView attentionNum;
        @ViewMapping(id = R.id.question_user_layout)
        private View userLayout;
    }
}

1.系统是如何绘制ListView的?

首先调用的是getCount()方法。得到它的返回值,即是ListView的长度。然后系统调用了getView()方法,根据这个长度主意绘制ListView的每一行,也就是说,如果getCount返回的是1,那么就只显示一行。而getItem()和getItemId()则在需要处理和取得Adapter中的数据时调用。

2.为什么要用ViewHolder这个内部类?

一个内部类class ViewHolder,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,比如onClick等等,这样可以不用每次都要findViewById了,减少了性能的消耗。如果将这个内部类前面用static修饰,就是静态类了,静态类只会在第一次加载的时候会耗时长,但是后面的就很好的帮助加载了,同时保证了内存中有一个viewHolder,节省内存的开销。

3.为什么要判断convertView是否为空?

     重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。

原文地址:https://www.cnblogs.com/hupp/p/4756609.html