使用ViewHolder Android的列表视图 [英] Android listview using ViewHolder

查看:124
本文介绍了使用ViewHolder Android的列表视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题。我试图改变一个图标在我的列表视图被点击后。它的工作原理正确,尽管不被修改只是点击的图标,还有那些不显示谁。例如,如果我单击列表视图,也是第五个图标变化的第一个项目的图标。此行为是重复以下物品(每五个项目的列表视图中)。 这是我的getView方法:

 公共类AlphabeticalAdapter扩展ArrayAdapter<字符串>
   {
       INT layoutResourceId;
       私人最终上下文的背景下;
       私人列表<字符串>数据;
       私人ProgressDialog mProgressDialog;
       私人ImageView的downloadImageButton;


       公共AlphabeticalAdapter(上下文的背景下,INT资源,列表和LT;字符串>数据){
           超级(上下文,资源,数据);
           this.layoutResourceId =资源;
           this.context =背景;
           this.data =数据;
       }

       公共查看getView(INT位置,查看convertView,ViewGroup中父){

          //查看rowView = convertView;
           最后ViewHolder viewHolder;

           如果(convertView == NULL){

               LayoutInflater充气=(LayoutInflater)上下文
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


               convertView = inflater.inflate(R.layout.catalogslist_single_row,父母,假);

           viewHolder =新ViewHolder();

           viewHolder.catlogTitle =(TextView中)convertView.findViewById(R.id.txtTitle);
           viewHolder.icon =(ImageView的)convertView.findViewById(R.id.imageView2);
           viewHolder.downloadImageButton =(ImageView的)convertView.findViewById(R.id.downloadImageButton);

           // downloadImageButton =(ImageView的)rowView.findViewById(R.id.downloadImageButton);

           viewHolder.position =位置;


           viewHolder.downloadImageButton.setOnClickListener(新OnClickListener(){
               @覆盖
               公共无效的onClick(视图v){
                     的System.out.println(下载preSSED);

                     viewHolder.downloadImageButton =(ImageView的)v.findViewById(R.id.downloadImageButton);
                     viewHolder.downloadImageButton.setImageResource(R.drawable.icon_ok);
                     viewHolder.downloadImageButton.setTag(下载);
                     //rowView.setTag("downloaded);


                 }
             });



           convertView.setTag(viewHolder);

           }

           其他{
               viewHolder =(ViewHolder)convertView.getTag();
           }

           viewHolder.catlogTitle.setText(data.get(位置));
           viewHolder.catlogTitle.setTypeface(regularDin);
           viewHolder.icon.setImageResource(R.drawable.cata);


           如果(viewHolder.downloadImageButton.getTag()==下载){
             downloadImageButton =(ImageView的)convertView.findViewById(R.id.downloadImageButton);
             downloadImageButton.setImageResource(R.drawable.icon_ok);
           }
           其他{
               downloadImageButton =(ImageView的)convertView.findViewById(R.id.downloadImageButton);
                 downloadImageButton.setImageResource(R.drawable.icon_download);
           }


           viewHolder.position =位置;

        返回convertView;

       } //关闭getView
 

...

这是我ViewHolder类:

 静态类ViewHolder {
       ImageView的downloadImageButton;
       TextView的catlogTitle;
       ImageView的图标;
       INT位置;
   }
 

解决方案

更​​改code下面,我想你缺少

 公共类AlphabeticalAdapter扩展ArrayAdapter<字符串> {
INT layoutResourceId;
私人最终上下文的背景下;
私人列表<字符串>数据;
私人列表<字符串>标签;
私人ProgressDialog mProgressDialog;
私人ImageView的downloadImageButton;

公共AlphabeticalAdapter(上下文的背景下,INT资源,列表和LT;字符串>数据){
    超级(上下文,资源,数据);
    this.layoutResourceId =资源;
    this.context =背景;
    this.data =数据;
    标签=新的ArrayList<字符串>();
    INT大小= data.size();
    的for(int i = 0; I<大小;我++){
        tags.add(标记);
    }
}

静态类ViewHolder {
    ImageView的downloadImageButton;
    TextView的catlogTitle;
    ImageView的图标;
    INT位置;
}

公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){

    //查看rowView = convertView;
    最后ViewHolder viewHolder;

    如果(convertView == NULL){
        LayoutInflater充气=(LayoutInflater)上下文
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // convertView = inflater.inflate(R.layout.catalogslist_single_row,
        //父,假);
        viewHolder =新ViewHolder();
        viewHolder.position =位置;
        viewHolder.downloadImageButton
                .setOnClickListener(新OnClickListener(){
                    @覆盖
                    公共无效的onClick(视图v){
                        的System.out.println(下载preSSED);
                        viewHolder.downloadImageButton.setTag(下载);
                        tags.add(位置,已下载);
                    }
                });
        convertView.setTag(viewHolder);
    } 其他 {
        viewHolder =(ViewHolder)convertView.getTag();
    }

    viewHolder.catlogTitle.setText(data.get(位置));
    viewHolder.catlogTitle.setTypeface(regularDin);
    viewHolder.icon.setImageResource(R.drawable.cata);

    如果(tags.get(位置)==下载){
        downloadImageButton.setImageResource(R.drawable.icon_ok);
    } 其他 {
        downloadImageButton.setImageResource(R.drawable.icon_download);
    }

    viewHolder.position =位置;
    返回convertView;
} //关闭getView
 

}

I have a problem. I'm attempting to change an icon in my listview after it has been clicked. It works correctly although are not modified only the clicked icons but also those who are not displayed. For example if I click the icon in the first item of the listview, also the fifth icon changes. This behaviour is repeated for all the following items (every five items of the listview). This is my getView method:

   public class AlphabeticalAdapter extends ArrayAdapter<String>
   {
       int layoutResourceId; 
       private final Context context;
       private List<String> data;
       private ProgressDialog mProgressDialog;
       private ImageView downloadImageButton;


       public AlphabeticalAdapter(Context context, int resource, List<String> data){
           super(context, resource, data);
           this.layoutResourceId = resource;
           this.context = context;
           this.data = data;    
       }

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

          // View rowView = convertView;
           final ViewHolder viewHolder;

           if (convertView == null) {

               LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


               convertView  = inflater.inflate(R.layout.catalogslist_single_row, parent, false);

           viewHolder = new ViewHolder();

           viewHolder.catlogTitle=(TextView)convertView.findViewById(R.id.txtTitle);
           viewHolder.icon=(ImageView)convertView.findViewById(R.id.imageView2); 
           viewHolder.downloadImageButton=(ImageView)convertView.findViewById(R.id.downloadImageButton);

           //downloadImageButton = (ImageView)rowView.findViewById(R.id.downloadImageButton);

           viewHolder.position = position;


           viewHolder.downloadImageButton.setOnClickListener(new OnClickListener() {
               @Override  
               public void onClick(View v) {
                     System.out.println("DOWNLOAD PRESSED");

                     viewHolder.downloadImageButton = (ImageView)v.findViewById(R.id.downloadImageButton);
                     viewHolder.downloadImageButton.setImageResource(R.drawable.icon_ok);
                     viewHolder.downloadImageButton.setTag("downloaded");
                     //rowView.setTag("downloaded");


                 }
             });



           convertView.setTag(viewHolder);

           }

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

           viewHolder.catlogTitle.setText(data.get(position));
           viewHolder.catlogTitle.setTypeface(regularDin);
           viewHolder.icon.setImageResource(R.drawable.cata);


           if(viewHolder.downloadImageButton.getTag() == "downloaded"){
             downloadImageButton = (ImageView)convertView.findViewById(R.id.downloadImageButton);
             downloadImageButton.setImageResource(R.drawable.icon_ok);
           }
           else{
               downloadImageButton = (ImageView)convertView.findViewById(R.id.downloadImageButton);
                 downloadImageButton.setImageResource(R.drawable.icon_download);
           }


           viewHolder.position = position;

        return convertView;

       } //close getView 

...

And this is my ViewHolder class:

      static class ViewHolder{
       ImageView downloadImageButton;
       TextView catlogTitle;
       ImageView icon;
       int position;
   }

解决方案

Change your code at below, i think you missing that

public class AlphabeticalAdapter extends ArrayAdapter<String> {
int layoutResourceId;
private final Context context;
private List<String> data;
private List<String> tags;
private ProgressDialog mProgressDialog;
private ImageView downloadImageButton;

public AlphabeticalAdapter(Context context, int resource, List<String> data) {
    super(context, resource, data);
    this.layoutResourceId = resource;
    this.context = context;
    this.data = data;
    tags = new ArrayList<String>();
    int size = data.size();
    for (int i = 0; i < size; i++) {
        tags.add("tag");
    }
}

static class ViewHolder {
    ImageView downloadImageButton;
    TextView catlogTitle;
    ImageView icon;
    int position;
}

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

    // View rowView = convertView;
    final ViewHolder viewHolder;

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // convertView = inflater.inflate(R.layout.catalogslist_single_row,
        // parent, false);
        viewHolder = new ViewHolder();
        viewHolder.position = position;
        viewHolder.downloadImageButton
                .setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        System.out.println("DOWNLOAD PRESSED");
                        viewHolder.downloadImageButton.setTag("downloaded");
                        tags.add(position, "downloaded");
                    }
                });
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.catlogTitle.setText(data.get(position));
    viewHolder.catlogTitle.setTypeface(regularDin);
    viewHolder.icon.setImageResource(R.drawable.cata);

    if (tags.get(position) == "downloaded") {
        downloadImageButton.setImageResource(R.drawable.icon_ok);
    } else {
        downloadImageButton.setImageResource(R.drawable.icon_download);
    }

    viewHolder.position = position;
    return convertView;
} // close getView

}

这篇关于使用ViewHolder Android的列表视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆