如何在自定义列表视图中保留视图的特定属性

时间:2015-09-25 07:26:14

标签: android listview android-listview

如何根据位置更改持有人内部的视图属性? 这个问题只有在使用回收时才会出现 有数据持有者类。我可以根据位置为每个不同的文本视图设置不同的标题,但我无法根据位置更改每个文本视图的文本大小。

当然使用recycleView = false它可以正常工作,因为视图不会被回收,但如何使它与Recycler一起使用?

boolean recycleView = false;
ArrayList<SocialItem> list;

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder holder = null;
    if (convertView == null || !recycleView) {

        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.social_list_item, null);

        holder = new ViewHolder();
        holder.title1 = (TextView) convertView.findViewById(R.id.si_title1);
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.title1.setText(list.get(position).getTitle1());

    //changes textsize of textview to fit in specific width, and saves in our holder list, and sets from it in textview
    list.get(position).setTxtSize1(Util.correctTVWidth(holder.title1, 110));
    holder.title1.setTextSize(TypedValue.COMPLEX_UNIT_PX, list.get(position).getTxtSize1());

    return convertView;
}

Kingfisher Phuoc 的解决方案有效,但为什么以下代码无法正常工作? 我认为它的作用是,它根据位置将计算的文本大小保存在一个简单的pojo持有者中,并在视图中设置文本化,不应该有效吗?

    //changes textsize of textview to fit in specific width, and saves in our holder list, and sets from it in textview
    list.get(position).setTxtSize1(Util.correctTVWidth(holder.title1, 110));
    holder.title1.setTextSize(TypedValue.COMPLEX_UNIT_PX, list.get(position).getTxtSize1());

1 个答案:

答案 0 :(得分:1)

如果我不误解,你需要在特定的位置改变观点,对吗?如果这是你想要的,你可以做到。为什么不?请看下面的例子:

if(position == somePositionYouWant){ // change textsize at specific position
    holder.yourTextView.setTextSize(yourtextSize);
}else{
    // you must reset your textsize in other position or everything will be mess
    holder.yourTextView.setTextSize(defaultTextSize);
}

如果我没错,您可以使用Util.correctTVWidth(holder.title1, 110)来计算textsize。但是,您应该记住convertView被重用。这意味着如果任何行不可见,它将被重用于下一个可见视图。例如,列表视图中的10个项目是可见的,当您向下滚动时,第11个项目将可见并重复使用第1个项目的视图,TextView属性将保留在第1个项目中。如果您根据第11项第1项的holder.title1计算文本大小,可能是您的代码不起作用的原因。