【问题标题】:Images within listview repeating on scroll列表视图中的图像在滚动时重复
【发布时间】:2017-09-26 11:47:46
【问题描述】:

当滚动浏览 6 个图像的列表视图时,前 3 个图像与最后 3 个图像再次重复。文本也从前 3 个重复相同,但我的 toast 消息显示正确的消息,例如。图 1 - 6。

这是适配器类

public class CustomAdapter extends BaseAdapter {

Context context;
List<RowItem> rowItems;

CustomAdapter(Context context, List<RowItem> rowItems) {
    this.context = context;
    this.rowItems = rowItems;
}

@Override
public int getCount() {
    return rowItems.size();
}

@Override
public Object getItem(int position) {
    return rowItems.get(position);
}

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}

/* private view holder class */
private class ViewHolder {
    ImageView profile_pic;
    TextView pic_name;
}

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

    ViewHolder holder = null;

    View mView;

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();

        holder.pic_name = (TextView) convertView.findViewById(R.id.pic_name);
        holder.profile_pic = (ImageView) convertView.findViewById(R.id.profile_pic);

        convertView.setTag(holder);

        RowItem row_pos = rowItems.get(position);

        holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
        holder.pic_name.setText(row_pos.getPic_name());

        convertView.setTag(holder);



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

    return convertView;
}

}

我的主要活动

public class MainActivity extends Activity implements OnItemClickListener {

String[] pic_names;
TypedArray profile_pics;

List<RowItem> rowItems;
ListView mylistview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    rowItems = new ArrayList<RowItem>();
    pic_names = getResources().getStringArray(R.array.pic_names);
    profile_pics = getResources().obtainTypedArray(R.array.profile_pics);

    for (int i = 0; i < pic_names.length; i++) {
        RowItem item = new RowItem(pic_names[i], profile_pics.getResourceId(i, -1));
        rowItems.add(item);
    }

    mylistview = (ListView) findViewById(R.id.list);
    CustomAdapter adapter = new CustomAdapter(this, rowItems);
    mylistview.setAdapter(adapter);

    mylistview.setOnItemClickListener(this);

}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {

    String pic_name = rowItems.get(position).getPic_name();
    Toast.makeText(getApplicationContext(), "" +  pic_name,
            Toast.LENGTH_SHORT).show();
}





}

这些是 getter 和 setter

public class RowItem {

private String pic_name;
private int profile_pic_id;

public RowItem(String pic_name, int profile_pic_id) {

    this.pic_name = pic_name;
    this.profile_pic_id = profile_pic_id;

}

public String getPic_name() {
    return pic_name;
}

public void setPic_name(String pic_name) {
    this.pic_name = pic_name;
}

public int getProfile_pic_id() {
    return profile_pic_id;
}

public void setProfile_pic_id(int profile_pic_id) {
    this.profile_pic_id = profile_pic_id;
}

}

【问题讨论】:

    标签: java android listview android-studio


    【解决方案1】:

    如果有条件,请把这行写在外面

        RowItem row_pos = rowItems.get(position);
    
        holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
        holder.pic_name.setText(row_pos.getPic_name());
    

    从你的代码中再删除一行并只保留一次,你写了这行两次

    convertView.setTag(holder);
    

    最终代码

    public class CustomAdapter extends BaseAdapter {
    
            Context context;
           List<RowItem> rowItems;
    
           CustomAdapter(Context context, List<RowItem> rowItems) {
               this.context = context;
               this.rowItems = rowItems;
           }
    
           @Override
           public int getCount() {
               return rowItems.size();
           }
    
           @Override
           public Object getItem(int position) {
               return rowItems.get(position);
           }
    
           @Override
           public long getItemId(int position) {
               return rowItems.indexOf(getItem(position));
           }
    
           /* private view holder class */
           private class ViewHolder {
               ImageView profile_pic;
               TextView pic_name;
           }
    
           @Override
           public View getView(int position, View convertView, ViewGroup parent) {
    
               ViewHolder holder = null;
    
               View mView;
    
               LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    
               if (convertView == null) {
                   convertView = mInflater.inflate(R.layout.list_item, null);
                   holder = new ViewHolder();
    
                   holder.pic_name = (TextView) convertView.findViewById(R.id.pic_name);
                   holder.profile_pic = (ImageView) convertView.findViewById(R.id.profile_pic);
    
                   convertView.setTag(holder);
    
    
               } else {
                   holder = (ViewHolder) convertView.getTag();
               }
    
                   RowItem row_pos = rowItems.get(position);
    
                   holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
                   holder.pic_name.setText(row_pos.getPic_name());
    
               return convertView;
           }
       }
    

    【讨论】:

    • 工作完美,代表我犯了一个简单的错误!
    • @Ashley'Splash'Elliott 请接受答案,您的问题已解决。谢谢
    • 只是等待计时器倒计时,然后就会这样做!
    • 哦,我明白了... :)
    【解决方案2】:

    您的getView() 方法错误。当没有回收视图时,您正确地考虑了 View 的创建,但在向您提供回收的 convertView 时未能更改内容。这就是图像永远不会改变的原因。

    getView():中进行以下更改

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        ViewHolder holder = null;
    
        View mView;
    
        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder = new ViewHolder();
            convertView.setTag(holder);
            holder.pic_name = (TextView) convertView.findViewById(R.id.pic_name);
        holder.profile_pic = (ImageView) convertView.findViewById(R.id.profile_pic);
    
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
    
        RowItem row_pos = rowItems.get(position);
    
        holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
        holder.pic_name.setText(row_pos.getPic_name());
        return convertView;
    }
    

    【讨论】:

      【解决方案3】:

      在if条件之外设置图片资源

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
      
          ViewHolder holder = null;
      
          View mView;
      
          LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
      
          if (convertView == null) {
              convertView = mInflater.inflate(R.layout.list_item, null);
              holder = new ViewHolder();
      
              holder.pic_name = (TextView) convertView.findViewById(R.id.pic_name);
              holder.profile_pic = (ImageView) convertView.findViewById(R.id.profile_pic);
              convertView.setTag(holder);
              convertView.setTag(holder);
          } else {
              holder = (ViewHolder) convertView.getTag();
          }
      
          RowItem row_pos = rowItems.get(position);
          holder.profile_pic.setImageResource(row_pos.getProfile_pic_id());
          holder.pic_name.setText(row_pos.getPic_name());
      
          return convertView;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-20
        • 2013-09-22
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多