【问题标题】:Strange behaviour when manipulating ListView's item操作 ListView 的项目时的奇怪行为
【发布时间】:2014-01-27 04:34:34
【问题描述】:

我想在用户单击“关于”imageView 时增加“layout_quota_info”的高度,所以我为 imageview 设置了一个 onclicklistener。

但是,当用户单击第 1 行中的 about 按钮时,它也会影响其他行。仅当我需要向下滚动时列表长度较长时才会发生这种情况。

我猜这个问题与 ViewHolder 的回收有关,但我不知道如何修复它...... 请帮忙....

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    Section section = list.get(position);

    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater
                .inflate(R.layout.list_section_item, null, false);
        holder = new ViewHolder();
        holder.name = (TextView) convertView.findViewById(R.id.list_section_name);
        holder.room = (TextView) convertView.findViewById(R.id.list_section_room);
        holder.instructor = (TextView) convertView.findViewById(R.id.list_section_instructor);
        holder.datetime = (TextView) convertView.findViewById(R.id.list_section_datetime);
        holder.about = (ImageView) convertView.findViewById(R.id.list_section_about);
        holder.quota = (TextView) convertView.findViewById(R.id.list_section_quota);
        holder.avail = (TextView) convertView.findViewById(R.id.list_section_avail);
        holder.enrol = (TextView) convertView.findViewById(R.id.list_section_enrol);
        holder.wait = (TextView) convertView.findViewById(R.id.list_section_wait);
        holder.quota_info = (LinearLayout) convertView.findViewById(R.id.layout_quota_info);
        holder.layout_card = (LinearLayout) convertView.findViewById(R.id.layout_card);
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }

    holder.name.setText(section.name);
    holder.room.setText(section.room);
    holder.quota.setText("Quota\n" + section.quota);
    holder.avail.setText("Avail\n" + section.avail);
    holder.enrol.setText("Enrol\n" + section.enrol);
    holder.wait.setText("Wait\n" + section.wait);
    holder.instructor.setText(section.instructor);
    holder.datetime.setText(section.datetime);
    holder.quota_info.getLayoutParams().height = 1;
    holder.quota_info.requestLayout();
    holder.about.setOnClickListener(new OnSectionMoreClickListener(holder, section){

        @Override
        public void onClick(View v) {
            ViewHolder holder = (ViewHolder) getViewHolder();
            Section section = getSection();

                LinearLayout ll = holder.quota_info;
                ResizeAnimation anim = new ResizeAnimation(ll, ll.getWidth(), ll.getHeight(), ll.getWidth(), ll.getHeight() + 165f);
                anim.setDuration(300);
                //anim.setFillAfter(true);
                ll.startAnimation(anim);
                ll.setVisibility(View.VISIBLE);


        }

    });
    return convertView;
}

class ViewHolder {
    TextView name;
    TextView room;
    TextView instructor;
    TextView datetime;
    TextView avail;
    TextView enrol;
    TextView wait;
    TextView quota;
    ImageView about;
    LinearLayout layout_card;
    LinearLayout quota_info;
}

【问题讨论】:

    标签: android listview


    【解决方案1】:

    正如你所说。因为您已经扩展了一行,并且当您开始滚动新行时该行将被回收/重用,因此该行将显示为已用完。

    你应该做的是在你的else语句中,检查布局高度的大小,如果需要的话,减少它。

    else{
            holder = (ViewHolder) convertView.getTag();
    
            if (holder.quota_info.getHeight() > ORIGINAL_SIZE) {
                // Minimize it. no need for animation
            }
        }
    

    【讨论】:

    • 它适用于下面的行!但这会使用户展开的行在向后滚动后变得未展开
    • 确实如此,在这种情况下,您需要跟踪哪些行需要展开,哪些行在显示时应该折叠。一个快速的方法是向你的部分对象添加一个布尔值,或者一个二级布尔数组
    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2014-12-19
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多