1

我有一个 ListActivity 显示项目列表,每个项目的右端都有一个 ImageView,它在开头显示一个箭头图标。按下某个按钮后,我想用删除图标替换这些箭头图标。为此,我已更改 ListView 的 ArrayAdapter 并调用 notifyDataSetChanged()。在 ArrayAdapter 的 getView 方法中,我为 ImageView 设置了 ImageResource,但更改未显示在列表中,只有第一个条目具有更改的图标。

这是 ArrayAdapter 代码:

private class CCAdapter extends ArrayAdapter<CCcenter>{

    ArrayList<CCcenter> items;
    int mode;
    public CCAdapter(Context context, int textViewResourceId, ArrayList<CCcenter> Items,int m) {
        super(context, textViewResourceId, Items);
        this.items=Items;
        this.mode=m;
        // TODO Auto-generated constructor stub
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.lisitem, null);
            }
            final CCcenter o = items.get(position);
            if (o != null) {

                    TextView title = (TextView) v.findViewById(R.id.ttl_txt);
                    TextView desc=(TextView)v.findViewById(R.id.desc_txt);
                    TextView dist=(TextView)v.findViewById(R.id.dist_txt);
                    ImageView icon=(ImageView)findViewById(R.id.lst_icon);
                    RatingBar rating=(RatingBar)findViewById(R.id.lst_ratings);

                    if(title!=null)
                    {
                        title.setText(o.title);
                    }
                    if(desc!=null)
                    {
                        desc.setText(o.desc);
                    }
                    if(dist!=null)
                    {
                        dist.setText(o.dist);
                    }
                    if(rating!=null)
                    {
                        rating.setRating(o.rating);
                    }
                    if(icon!=null) //edit mode
                    {
                        if(this.mode==1)
                        {
                            icon.setImageResource(R.drawable.arrow);
                        }
                        else
                        {
                            icon.setImageResource(R.drawable.dlet);
                        }
                    }
            }
            return v;
    }

}

在按钮的 OnClick 方法中,我执行以下操作:

CCAdapter mAdapter=new CCAdapter(context, R.layout.lisitem, CCS,2);
             MyList.this.setListAdapter(mAdapter);
                   mAdapter.notifyDataSetChanged();
             MyList.this.getListView().invalidateViews();

但是在这样做之后,只有列表的第一个条目有一个删除图标,其他人只显示默认的箭头图标。我做错了什么?

4

3 回答 3

0

我认为这是你的问题:

final CCcenter o = items.get(position);

您已将其声明为最终... 所以我很惊讶你的清单没有一遍又一遍地显示相同的项目。

尝试删除最终声明,看看会发生什么。

于 2012-05-14T14:17:44.057 回答
0

制作一个内部静态类来保存您的视图的引用,例如

static class viewHolder{
TextView title ;
TextView desc;
TextView dist;
ImageView icon;
RatingBar rating;

}

然后在getview中使用类似的东西:

public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    viewHolder holder;
    if (v == null)
    {
        holder=new ViewHolder();
        LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.lisitem, null);
        holder.title = (TextView) v.findViewById(R.id.ttl_txt);
        holder.desc=(TextView)v.findViewById(R.id.desc_txt);
        holder.dist=(TextView)v.findViewById(R.id.dist_txt);
        holder.icon=(ImageView)findViewById(R.id.lst_icon);
        holder.rating=(RatingBar)findViewById(R.id.lst_ratings);
        v.setTag(holder);
    }
    else
    {
        holder=(ViewHolder)v.getTag();
    }
    CCcenter o = items.get(position);
    if(title!=null)
    {
        holder.title.setText(o.title);
    }
    if(desc!=null)
    {
        holder.desc.setText(o.desc);
    }
    if(dist!=null)
    {
        holder.dist.setText(o.dist);
    }
    holder.rating.setRating(o.rating);
    if(this.mode==1)
    {
        holder.icon.setImageResource(R.drawable.arrow);
    }
    else
    {
        holder.icon.setImageResource(R.drawable.dlet);
    }
    return v;
}
于 2012-05-14T14:19:36.047 回答
0

像这样检索 RatingBar 和 ImageView 的代码中的愚蠢错误

ImageView icon=(ImageView) findViewById(R.id.lst_icon);
RatingBar rating=(RatingBar) findViewById(R.id.lst_ratings);

但是这些应该这样做

ImageView icon=(ImageView) v.findViewById(R.id.lst_icon);
RatingBar rating=(RatingBar) v.findViewById(R.id.lst_ratings);
于 2012-05-27T18:50:53.973 回答