有条件地更改列表适配器android

时间:2013-07-11 22:55:34

标签: java android facebook

我正在使用Facebook SDK开发适用于Android的应用。到目前为止,该应用程序扫描某些页面提要并将所有帖子放入GridView。我想要它,以便如果当前位置的imageArray的值为空或null(没有图片的帖子),则它将ImageView可见性设置为GONE并使TextView占用整个项目。这是我的代码:

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

    MainListHolder mHolder;
    if (v == null) {
        mHolder = new MainListHolder();
        v = inflator.inflate(R.layout.list_item, null);
        mHolder.img1 = (ImageView) v.findViewById(R.id.preview);
        mHolder.txt2 = (TextView) v.findViewById(R.id.message);
        mHolder.txt3 = (TextView) v.findViewById(R.id.user_name);
        mHolder.txt4 = (TextView) v.findViewById(R.id.user_id);
        v.setTag(mHolder);
    } else {
        mHolder = (MainListHolder) v.getTag();
    }

    if (!imageArray.get(position).isEmpty()) {
        manager.DisplayImage(imageArray.get(position), loader, mHolder.img1);
    }
    else    {
        manager.DisplayImage(null, loader, mHolder.img1);
        mHolder.img1.setVisibility(ImageView.GONE);
    }
    mHolder.txt2.setText(messageArray.get(position));
    mHolder.txt3.setText(nameArray.get(position));
    mHolder.txt4.setText(idArray.get(position));

    return v;
}

问题是GridView现在在我滚动时更改其项目。即使项目有图片,ImageView也会消失。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你的问题出现在这部分代码中:

if (!imageArray.get(position).isEmpty()) {
    manager.DisplayImage(imageArray.get(position), loader, mHolder.img1);
}
else {
    manager.DisplayImage(null, loader, mHolder.img1);
    mHolder.img1.setVisibility(ImageView.GONE);
}

因此,如果imageView的图像不存在,则使img1 GONE。但是如果图像存在,滚动后img1仍然保持GONE,因为你没有调用mHolder.img1.setVisibility(ImageView.VISIBLE)。这是因为当你滚动时,你的listItem视图是回收的,所以在适配器中你必须始终处理这两个条件。

所以你的代码看起来像这样:

if (!imageArray.get(position).isEmpty()) {
    mHolder.img1.setVisibility(ImageView.VISIBLE);
    manager.DisplayImage(imageArray.get(position), loader, mHolder.img1);
}
else {
    manager.DisplayImage(null, loader, mHolder.img1);
    mHolder.img1.setVisibility(ImageView.GONE);
}
  

更好地理解问题的示例:

想象一下列表适配器中的这段代码getView()mehod:

if(isEnabled) {
   textView.setText("ENABLED");
}

在这种情况下,textView将在滚动后始终显示文本ENABLED,因为textview将没有其他部分显示其他文本。 因此代码应如下所示:

if(isEnabled) 
   textView.setText("ENABLED");
else
   textView.setText("DISABLED");

希望它会对你有所帮助。