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也

你可能感兴趣的:(ListView 与ViewHolder)