【问题标题】:Conditionally changing list adapter android有条件地改变列表适配器android
【发布时间】:2013-07-11 22:55:33
【问题描述】:

我正在使用 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 现在在我滚动时会更改其项目。即使item有图片,ImageView也会消失。我该如何解决这个问题?

【问题讨论】:

    标签: java android facebook


    【解决方案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() 方法中的这段代码:

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

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

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

    希望对你有所帮助。

    【讨论】:

    • 我实际上只是在看到这个答案之前想到了那个时刻,你确认了它。现在可以了!谢谢!
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 2018-07-02
    • 2018-07-04
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多