ListView 与ViewHolder
来源:互联网 发布:zynga 知乎 编辑:程序博客网 时间:2024/06/06 13:12
最近在实现 动态获取网络数据,将其加载进ListView 的Adapter ==> mBaseAdapter中,同时使用自定义静态类ViewHolder储存视图控件引用,功能预计:
点击按钮 立即下单 后,可选和立即下单按钮变为 不可选 和 已经下单:
问题来了:
我只是点击了ListView 的第一个Item中的立即下单按钮,但是第一个Item和第3个Item都变为 不可选和已经下单。即 点击一个Item ,会影响到其它Item;
这个问题缠绕了我一个下午,最后我想到,应该是ViewHolder 中的控件引用已经被 设置过了,按钮已经设置为 已经下单 ,再次使用 ViewHolder, 而我理想的初始化状态是 按钮文字为立即下单。所以我 自定义一个方法
initViewHolder(holder);来初始化viewHolder,问题就解决了。博主语文水平很差,并且第一次写博客,可能表达不清晰;
我再次说明一下重点,就是,ViewHolder里面是 控件的引用 ,首次对ViewHolder的控件初始化之后,第二次使用如果不对控件进行设置(例如:setText方法或者其它设置),listView显示出来的第二个Item及其之后的Item会和
第一个Item一样;
public View getView(final int position, View convertView, ViewGroup parent) {
final Course course = dataList.get(position); List tests = selectCourseList; ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.index_layout, parent, false); holder.teacher_img = (ImageView) convertView.findViewById(R.id.teacher_img); holder.course_img = (ImageView) convertView.findViewById(R.id.course_img); holder.course_name = (TextView) convertView.findViewById(R.id.course_name); holder.course_info = (TextView) convertView.findViewById(R.id.course_info); holder.course_time = (TextView) convertView.findViewById(R.id.course_time); holder.tv_add = (TextView) convertView.findViewById(R.id.tv_add); holder.tv_left = (TextView) convertView.findViewById(R.id.tv_left); holder.btn_buy = (Button) convertView.findViewById(R.id.btn_buy); holder.btn_on_select = (Button) convertView.findViewById(R.id.btn_on_select); holder.ll5 = (LinearLayout) convertView.findViewById(R.id.ll5); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } ImageCacheManger.loadImgTwo(getActivity(),mSQL.COURSE_IMGROOT+course.getImgCourseUrl(),holder.course_img); ImageCacheManger.loadImgTwo(getActivity(),mSQL.COURSE_IMGROOT+course.getImgTearchUrl(),holder.teacher_img); holder.course_name.setText(course.getCourseName()); holder.course_info.setText(course.getCourseBriefInfo()); holder.course_time.setText(course.getCourseTime()+"課時");initViewHolder(holder);
for (SelectCourse courseID : selectCourseList){ //测试 String thisCourses = course.getId(); String selectCourse = courseID.getCourseId(); selectCourseList.getClass().toString(); // boolean b = courseID.getCourseId() .equals(course.getId()); if (courseID.getCourseId() .equals(course.getId())){ //是否可选 holder.btn_on_select.setClickable(false); holder.btn_on_select.setText("不可选"); holder.btn_on_select.setBackgroundColor(Color.GRAY); //立即下单 holder.btn_buy.setClickable(false); holder.btn_buy.setBackgroundColor(Color.GRAY); holder.btn_buy.setText("已经下单"); }else { } } holder.teacher_img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showInfo(position); } }); // 立即下单 点击事件 holder.btn_buy.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new JsonParse(getActivity()){ @Override public void JsonParseSuccess(List list) { initStudentCourse(); myBaseAdapter.notifyDataSetChanged(); } @Override public void ReturnAllSelectCourses(List courseidList) { } }.update(getActivity(),mSQL.COURSE_BUY+"/1/"+course.getId()); } }); /** 为喜欢标注添加点击事件 */ holder.ll5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取控件 LinearLayout lv = (LinearLayout) v; TextView tv = (TextView) lv.findViewById(R.id.tv_add); ImageView iv = (ImageView) lv.findViewById(R.id.iv_like); // 判断是否为“喜欢”状态 if (is_Like) { tv.setText((Integer.parseInt(tv.getText().toString()) - 1) + ""); iv.setBackgroundResource(R.mipmap.tab_like_norma); is_Like = false; } else { tv.setText((Integer.parseInt(tv.getText().toString()) + 1) + ""); iv.setBackgroundResource(R.mipmap.tab_like_pressed); is_Like = true; } } }); return convertView;}
public void initViewHolder(ViewHolder holder){ //是否可选 holder.btn_on_select.setClickable(true); holder.btn_on_select.setText("可选"); holder.btn_on_select.setBackgroundColor(getResources().getColor(R.color.mBlue)); //立即下单 holder.btn_buy.setClickable(false); holder.btn_buy.setBackgroundColor(getResources().getColor(R.color.mBlue)); holder.btn_buy.setText("立即下单");}
并且将其加载进BaseAdapter 中的一个方法:
public View getView(final int position, View convertView, ViewGroup parent) {}
时,出现了点击某个 ListView 的Item 时,更新 其它Item也
0 0
- ListView 与ViewHolder
- ListView加载性能优化之ViewHolder的作用与用法
- ListView 使用 ViewHolder
- Listview 加载 ViewHolder
- ListView 使用 ViewHolder
- 使用ViewHolder优化ListView
- Android:ListView之ViewHolder
- Android - ViewHolder优化ListView
- listview的优化---viewHolder
- Android ViewHolder 优化 ListView
- android listview converView+ viewHolder
- ListView的优化--ViewHolder
- listView 优化 -ViewHolder
- ListView 使用 ViewHolder
- listview优化,viewHolder ,分页
- ViewHolder优化listview
- ListView 使用 ViewHolder
- 聊天ListView使用ViewHolder
- 解决Oracle安装使用中文乱码问题
- Httpclient
- POJ 1185 炮兵阵地(dp+状压)
- node环境搭建
- JavaScript 焦点事件
- ListView 与ViewHolder
- js获取select选中的标签option的值
- Yii createCommand CURD操作
- opencv学习笔记(九)捕获摄像头的视频并保存成avi格式
- Unity中2D和UGUI图集的理解与使用
- 京东量化教你如何量化选股
- 【Unity】子物体坐标问题
- STM---STM32F103 RCC
- swift中的转场动画