• 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,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。

  • 相关阅读:
    Python 模块chardet安装 setup.py
    Windows下Python安装lxml
    intellij idea 如何更改比编辑器文本字体和大小
    [转]C#设计模式(8)-Builder Pattern
    [转]C#设计模式(4)-Simple Factory Pattern
    [转]C#委托的异步调用
    [转]浅谈C#中常见的委托
    C# 线程池
    [转]C#中的委托和事件(续)
    C#(.net)中的DllImport
  • 原文地址:https://www.cnblogs.com/hupp/p/4756609.html
Copyright © 2020-2023  润新知