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