ListView 与ViewHolder

最近在实现 动态获取网络数据,将其加载进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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值