0

我的ListView. 我在几个项目中使用它们,并且每个项目都会出现错误。

在一种情况下,每个项目都有一个独特的图像,在另一种情况下,有些项目包含粗体文本,有些则没有。

当我滚动图像/粗体文本时不在正确的位置,并且当我在某个点(如果b )再次快速上下滚动时,几乎所有项目都是粗体。

我能找到的唯一帖子是这个,但它并没有解决问题。

这是我的自定义适配器:

private class MyAdapter extends BaseAdapter {

    private List<Object> obj;
    private LayoutInflater inflater;

    public MyAdapter(Context context, List<Object> obj_list) {
        this.obj_list = obj_list;
        this.inflater = LayoutInflater.from(context);
    }

    public int getCount(){
        return this.obj_list.size();
    }

    public Object getItem(int position){
        return this.obj_list.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if(convertView == null){
            convertView = inflater.inflate(R.layout.my_row_layout, null);
            holder = new ViewHolder();
            holder.item_one = (TextView)convertView.findViewById(R.id.txtItemOne);
            holder.item_two = (TextView)convertView.findViewById(R.id.txtItemTwo);

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

        Object objectItem = getItem(position);

        //here I set the boldness
        if(condition) {
            holder.item_one.setTypeface(null, Typeface.BOLD);
        }

        holder.item_one.setText(objectItem .getItemOne());
        holder.item_two.setText(objectItem .getItemTwo());            

        return convertView;
    }

    class ViewHolder {
        TextView hItemOne;
        TextView hItemTwo;          
    }
}

有谁知道我可能做错了什么?或者至少经历过同样的问题?

谢谢!

4

3 回答 3

2

问题是因为您使用的是 ViewHolder 模式,在视图持有者模式中,android 重用了现有视图。因此,当它重用以前生成的粗体视图时。现在,如果当它试图渲染视图但未能满足您应用的条件时,它只会渲染之前的粗体字面。因此,以下可以解决您的问题:

holder.item_one.setTypeface(null, Typeface.NORMAL);
//here I set the boldness
if(condition) {
      holder.item_one.setTypeface(null, Typeface.BOLD);
}
于 2013-07-30T07:32:16.820 回答
1
  1. 对于 Image 事物,使用 ImageLoader。是我使用的,并且很容易定制。

  2. 如果 TextView 应为粗体,请将其设置为粗体。如果需要正常,则设置为正常。ListViews 回收视图,因此您需要为每个视图手动设置首选项。

于 2013-07-30T07:38:46.650 回答
0

如果您必须在某些预定义的特定位置加粗,请执行以下操作,

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if(convertView == null){
            convertView = inflater.inflate(R.layout.my_row_layout, null);
            holder = new ViewHolder();
            holder.item_one = (TextView)convertView.findViewById(R.id.txtItemOne);
            holder.item_two = (TextView)convertView.findViewById(R.id.txtItemTwo);

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

        Object objectItem = getItem(position);


        if(position==2 || position==5) {
            holder.item_one.setTypeface(null, Typeface.BOLD);
            holder.item_one.setText(objectItem .getItemOne());
        }
        else
         holder.item_two.setText(objectItem .getItemTwo());            

        return convertView;
    }

但是请记住,如果您删除“else”,那么它将不起作用。

于 2013-07-30T07:36:59.433 回答