【问题标题】:ListView repeating some ImageViews in all the rowsListView 在所有行中重复一些 ImageView
【发布时间】:2014-04-17 17:20:32
【问题描述】:

我发现了很多关于这个主题的问题,但没有一个可以帮助我。就这样吧。

我正在使用这个 BaseAdapter 构建一个 ListView

public class ListAdapter extends BaseAdapter {

Context context;
int layout;
Person[] mpeople;

public PostListAdapter(Context context,int layout, Person[] people){
    this.context=context;
    this.layout=layout;
    this.mpeople=people;
}

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

    View v=convertView;

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(layout, parent, false);
    }

    Person swig=mpeople[position];

    ImageView profilepic= (ImageView) v.findViewById(R.id.profilepic);
    profilepic.setImageResource(swig.getUser().getProfilepic());
    TextView username= (TextView) v.findViewById(R.id.user_name);
    username.setText(swig.getUser().getUsername());
    TextView timestamp= (TextView) v.findViewById(R.id.time);
    timestamp.setText(Integer.toString(swig.getTimestamp()));
    TextView privacy= (TextView) v.findViewById(R.id.privacy);
    privacy.setText(swig.getPrivacy());
    TextView hashtag= (TextView) v.findViewById(R.id.hashtagtext);
    hashtag.setText(swig.getHashtag());
    TextView n_likes= (TextView) v.findViewById(R.id.likenumber);
    n_likes.setText(Integer.toString(swig.getN_likes()));
    TextView n_comments= (TextView) v.findViewById(R.id.commentnumber);
    n_comments.setText(Integer.toString(swig.getN_comments()));

    ImageView cell1= (ImageView) v.findViewById(R.id.cell1);
    cell1.setImageResource(swig.getPics()[0]);
    ImageView cell2= (ImageView) v.findViewById(R.id.cell2);
    cell2.setImageResource(swig.getPics()[1]);
    ImageView cell3= (ImageView) v.findViewById(R.id.cell3);
    cell3.setImageResource(swig.getPics()[2]);
    ImageView cell4= (ImageView) v.findViewById(R.id.cell4);
    cell4.setImageResource(swig.getPics()[3]);
    ImageView cell5= (ImageView) v.findViewById(R.id.cell5);
    cell5.setImageResource(swig.getPics()[4]);
    ImageView cell6= (ImageView) v.findViewById(R.id.cell6);
    cell6.setImageResource(swig.getPics()[5]);
    ImageView cell7= (ImageView) v.findViewById(R.id.cell7);
    cell7.setImageResource(swig.getPics()[6]);
    ImageView cell8= (ImageView) v.findViewById(R.id.cell8);
    cell8.setImageResource(swig.getPics()[7]);
    ImageView cell9= (ImageView) v.findViewById(R.id.cell9);
    cell9.setImageResource(swig.getPics()[8]);

    return v; 
}

@Override
public int getCount() {
    return mpeople.length;
}

@Override
public Object getItem(int arg0) {
    return mpeople[arg0];
}

@Override
public long getItemId(int arg0) {
    return arg0;
}

}

数组 People[] 是在片段上创建的,每个条目都是不同的 [确实如此,我检查过],但由于某种原因,当我运行代码时,代码的某些元素不是。

所有的 ImageViews cell1 到 cell9 只显示最后一个条目的图像。

如果需要更多代码或信息,请随时询问。

提前致谢。


已解决

问题出在数组的创建中,这是非常小的问题,与适配器无关。

【问题讨论】:

  • ... 在您按照其他人的建议使其工作之后,还请查看 ViewHolder 模式以摆脱所有那些 findViewById,这是一个非常慢的调用,您的下一个问题将是: “为什么我的列表滚动这么慢?”
  • 感谢您的建议,已经进行了所需的更改,我正在使用 ViewHolder。
  • 转向我的检查技巧不是那么好,再次检查后问题出在数组本身。所以,适配器正在完成它的工作。
  • 酷!即使它正在完成它的工作,使用 ViewHolder 模式也可以节省大量时间。在较小的适配器上可能差别不大,但在您的情况下,您有大量的 findViewById:每次视图进入或退出视图空间时,ListView 都会不断执行它们(在快速滚动的情况下数百次)

标签: android listview android-fragments android-listview baseadapter


【解决方案1】:

您的代码似乎可以这样工作:

  if (convertView == null) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(layout, parent, false);
 }
 /*
 ** you intitalize your findeviewbyid after when your view not getting null So its 
   recreate your inflatore view  this is not corect way
 *
  */

ImageView profilepic= (ImageView) v.findViewById(R.id.profilepic);

例如来自您的代码 您的代码应将视图 id 初始化为 convertview==null 条件满足

  Person swig=mpeople[position];
  if (convertView == null) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(layout, parent, false);
    ImageView profilepic= (ImageView) v.findViewById(R.id.profilepic);
    ImageView cell2= (ImageView) v.findViewById(R.id.cell2);
}
 cell1.setImageResource(swig.getPics());
 cell2.setImageResource(swig.getPics()[1]);

【讨论】:

  • 感谢您的回答。如果我将所有 findViewById 放在 if 语句中,将所有 setImageResource 放在外面,则列表仅显示列表中重复的三个条目,并且每行的 cell1 到 cell9 仍然相同。
  • 转向我的检查技巧不是那么好,再次检查后问题出在数组本身。所以,适配器正在完成它的工作。
  • 这里还有一个错误,cell2超出了它声明的范围。如果将声明移到 Person 附近并将其分配给 convertView,它将保存创建 convertView 时的 ImageView 的值(因此重复)。同样,当您使用 ViewHolder 时,此错误会消失 :)
  • @FilipeCardoso 如果它的回答对你有帮助...Please Accept answer
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多