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 に答える