【问题标题】:Android - ListView item style fails when scrollingAndroid - ListView 项目样式在滚动时失败
【发布时间】:2013-07-30 07:17:21
【问题描述】:

我的ListView 有问题。我在几个项目中使用它们,每个项目都会出现错误。

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

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

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

这是我的自定义适配器:

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;          
    }
}

有人知道我可能做错了什么吗?或者至少遇到过同样的问题?

谢谢!

【问题讨论】:

  • 移动“ holder.item_one.setText(objectItem .getItemOne());”在 if 条件内。
  • 为什么?无论如何我都想设置它...
  • 嗯,ListView 适配器会回收视图位置,因此当您滚动位置时会重新分配。
  • hm...我是这么认为的...但是我怎样才能让一些项目加粗一些不加粗呢?

标签: java android android-listview android-adapter


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    1. 对于 Image 事物,使用 ImageLoader。 This 是我用的,而且很容易定制。

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

    【讨论】:

      【解决方案3】:

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

       @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”,那么它将不起作用。

      【讨论】:

      • 谢谢,但到目前为止,上一个答案效果很好!如果我遇到问题,我会接受你的想法。无论如何谢谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2011-03-07
      • 2015-09-13
      相关资源
      最近更新 更多