【问题标题】:custom ArrayAdapter<Object> ViewHolder : imageView changes for several items in Listview not for one only自定义 ArrayAdapter<Object> ViewHolder : Listview 中多个项目的 imageView 更改不仅仅是一个
【发布时间】:2015-08-06 21:44:08
【问题描述】:

好的,我遇到了这个自定义 ArrayAdapter 的问题

public class AuthorsAdapter extends ArrayAdapter<Entity> {

    View row;
    static class ViewHolder {
        TextView textViewTitle;
        TextView textViewEntitySummary;
        ImageView imageViewPicture;
    }
    public AuthorsAdapter(Context context, LinkedList<Entity> entity) {
        super(context, 0, entity);
    }
    @Override
    public View getView( final int position,  View convertView,  final ViewGroup parent) {
        row = convertView;
        final ViewHolder holder;

        if (row == null) {
            row = LayoutInflater.from(getContext()).inflate(R.layout.listview_search_author_template, parent, false);
            holder = new ViewHolder();
            holder.textViewTitle = (TextView) row.findViewById(R.id.textView_TitleTopLeft);
            holder.textViewEntitySummary = (TextView) row.findViewById(R.id.textView_EntitySummary);
            holder.imageViewPicture = (ImageView) row.findViewById(R.id.imageView_author);
            row.setTag(holder);
        } else
            holder = (ViewHolder) row.getTag();


        holder.textViewTitle.setText(getItem(position).getTitle());
        if (!getItem(position).getPictureURL().isEmpty())
            Picasso.with(getContext()).load(getItem(position).getPictureURL()).into(holder.imageViewPicture);
        holder.textViewEntitySummary.setText(getItem(position).getBiography());


        holder.imageViewPicture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!getItem(position).isImageResized()) {
                    holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT));
                    getItem(position).setIsImageResized(true);
                } else if (getItem(position).isImageResized()) {
                    holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.MATCH_PARENT));
                    getItem(position).setIsImageResized(false);

                } else {
                    holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.MATCH_PARENT));

                }

            }
        });


        return row;
    }

imageView onclicklistener 一切正常:

holder.imageViewPicture.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!getItem(position).isImageResized()) {
                        holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.WRAP_CONTENT,
                                LinearLayout.LayoutParams.WRAP_CONTENT));
                        getItem(position).setIsImageResized(true);
                    } else if (getItem(position).isImageResized()) {
                        holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.WRAP_CONTENT,
                                LinearLayout.LayoutParams.MATCH_PARENT));
                        getItem(position).setIsImageResized(false);

                    } else {
                        holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.WRAP_CONTENT,
                                LinearLayout.LayoutParams.MATCH_PARENT));

                    }

                }
            });


}

我希望图像在点击时改变它的大小,它可以工作,但是当我在我的视图中向下滚动时,我的 listView 中的随机其他项目会受到点击第一个项目的影响......当我出现在我的 listview 中时图像不再调整大小(在我单击的索引处)任何提示可以使其完美运行?

【问题讨论】:

    标签: android listview android-listview imageview


    【解决方案1】:

    好的,我通过引用找到了解决方法

    private  LinkedList<Entity> entity;
    public AuthorsAdapter(Context context, LinkedList<Entity> entity) {
        super(context, 0, entity);
        this.entity = entity;
    }
    

    在构造函数中 然后不要像你说的那样做:

    ....  else{
                  holder = (ViewHolder) convertView.getTag();
                }
                         if (!getItem(position).isImageResized()) {
                            holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                    LinearLayout.LayoutParams.WRAP_CONTENT,
                                    LinearLayout.LayoutParams.WRAP_CONTENT));
                            getItem(position).setIsImageResized(true);
                        } else if (getItem(position).isImageResized()) {
                            holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                    LinearLayout.LayoutParams.WRAP_CONTENT,
                                    LinearLayout.LayoutParams.MATCH_PARENT));
                            getItem(position).setIsImageResized(false);
    
                        } else {
                            holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                    LinearLayout.LayoutParams.WRAP_CONTENT,
                                    LinearLayout.LayoutParams.MATCH_PARENT));
    
                        } .....
    

    我做了一个这样的增强 for 循环:

    ....  else{
                      holder = (ViewHolder) convertView.getTag();
                    }
    
    for (Entity foo : entity) {
                if (!foo.isImageResized()) {
                    holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                            25,
                            25));
                } else if (foo.isImageResized())
                    holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.MATCH_PARENT,
                            LinearLayout.LayoutParams.MATCH_PARENT));
    
            } ....
    

    请注意,我在我的 xml 布局中做了一些更改,所以现在图像就在标题下方 :) 并且我让它匹配父级以获得更大尺寸的图像...

    顺便说一句,非常感谢@Ammar aly 的提示,它真的帮助了我

    【讨论】:

      【解决方案2】:
      public class AuthorsAdapter extends ArrayAdapter<Entity> {
      
      
          static class ViewHolder {
              TextView textViewTitle;
              TextView textViewEntitySummary;
              ImageView imageViewPicture;
          }
          public AuthorsAdapter(Context context, LinkedList<Entity> entity) {
              super(context, 0, entity);
          }
          @Override
          public View getView( final int position,  View convertView,  final ViewGroup parent) {
      
              final ViewHolder holder;
      
              if (convertView == null) {
                  convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_search_author_template, parent, false);
                  holder = new ViewHolder();
                  holder.textViewTitle = (TextView) convertView.findViewById(R.id.textView_TitleTopLeft);
                  holder.textViewEntitySummary = (TextView) convertView.findViewById(R.id.textView_EntitySummary);
                  holder.imageViewPicture = (ImageView) convertView.findViewById(R.id.imageView_author);
                  convertView.setTag(holder);
              } else{
                holder = (ViewHolder) convertView.getTag();
              }
                       if (!getItem(position).isImageResized()) {
                          holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                  LinearLayout.LayoutParams.WRAP_CONTENT,
                                  LinearLayout.LayoutParams.WRAP_CONTENT));
                          getItem(position).setIsImageResized(true);
                      } else if (getItem(position).isImageResized()) {
                          holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                  LinearLayout.LayoutParams.WRAP_CONTENT,
                                  LinearLayout.LayoutParams.MATCH_PARENT));
                          getItem(position).setIsImageResized(false);
      
                      } else {
                          holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                  LinearLayout.LayoutParams.WRAP_CONTENT,
                                  LinearLayout.LayoutParams.MATCH_PARENT));
      
                      }
      
      
              holder.textViewTitle.setText(getItem(position).getTitle());
              if (!getItem(position).getPictureURL().isEmpty())
                  Picasso.with(getContext()).load(getItem(position).getPictureURL()).into(holder.imageViewPicture);
              holder.textViewEntitySummary.setText(getItem(position).getBiography());
      
      
              holder.imageViewPicture.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
               if (!getItem(position).isImageResized()) {
                          holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                  LinearLayout.LayoutParams.WRAP_CONTENT,
                                  LinearLayout.LayoutParams.WRAP_CONTENT));
                          getItem(position).setIsImageResized(true);
                      } else if (getItem(position).isImageResized()) {
                          holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                  LinearLayout.LayoutParams.WRAP_CONTENT,
                                  LinearLayout.LayoutParams.MATCH_PARENT));
                          getItem(position).setIsImageResized(false);
      
                      } else {
                          holder.imageViewPicture.setLayoutParams(new LinearLayout.LayoutParams(
                                  LinearLayout.LayoutParams.WRAP_CONTENT,
                                  LinearLayout.LayoutParams.MATCH_PARENT));
      
                      }
      
                  }
              });
      
      
              return convertView;
          }
      

      【讨论】:

      • 有了这个似乎随机设置图像视图大小:(
      • 好吧,让我改变答案,而不是你尝试
      • 感谢@Ammar aly 也许我误解了一些东西,但我通过使用基于您的解决方案的增强 for 循环创建了一个解决方法......它真的帮助了我,所以我将您的答案标记为一个很好的解决方案;)
      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      相关资源
      最近更新 更多