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
原创粉丝点击