【问题标题】:Utilizing 2 Layouts within a ListView在 ListView 中使用 2 个布局
【发布时间】:2014-12-02 05:44:55
【问题描述】:

我一直在尝试实现一个 ListView,它根据行使用 2 个单独的布局。第一个布局有 1 个 imageview,第二个布局有 2 个 imageview。

我想这样做,以便我可以让 ListView 中的每一行包含交替布局,但也能够用完 ArrayList bitmapArray 中的内容;

例如,第一行将包含前 2 个位图图像,第二行将包含 1 个大位图图像,第三行将是 2 个并排的位图图像......等等。

更新

我已经让它工作了一些,但问题仍然存在于图像没有正确分离的地方。它只是重复使用总共 4 张不同的图片,并且奇怪地将它们分开......我将在下面尝试说明

每个数字代表BitmapArray中的一张图片(0-19共20张图片)

需要

[   0   ]
[ 1 , 2 ]
[   3   ]
[ 4,  5 ]
[   6   ]
[ 7,  8 ]
[   9   ]
[10 , 11]
[  12   ]
[13,  14]
[  15   ]
[16,  17]
[  18   ]
[ 19, --]

德戈雷姆的更新模式

[   0   ]
[ 1 , 2 ]
[   2   ]
[ 3 , 4 ]
REPEAT

**BitmapArray 中总共只存储了 20 张图像。我发现的另一个问题是,当我在后面的一行(比如 10)上按 OnItemClick 时,它会将我带到另一个位图放大的活动(如设计的那样)。奇怪的是,它将是一个完全不同的图像,一个可能对应于数组中的那个位置。 **

Here is the code that I have been working with.

    public class FeedAdapter extends ArrayAdapter<Bitmap> {

        private static final int TYPE_BIG_ITEM = 0;
        private static final int TYPE_SMALL_ITEM = 1;

        public FeedAdapter(Context context, ArrayList<Bitmap> bitmapArray) {
            super(context, R.layout.feed_listview_big);
        }

        private class ViewHolder {
            ImageView ivPictureSmallOne;
            ImageView ivPictureSmallTwo;
            ImageView ivPictureBig;
        }

        @Override
        public int getViewTypeCount() {
            return 2;
        }

        @Override
        public int getItemViewType(int position) {
            return position % 2;
        }

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

            Bitmap bmp = getItem(position);
            ViewHolder viewHolder;


            if (convertView == null) {
                viewHolder = new ViewHolder();
                LayoutInflater inflater = LayoutInflater.from(getContext());
                if (getItemViewType(position) == 0) {
                    convertView = inflater.inflate(R.layout.feed_listview_small,
                            null);
                    viewHolder.ivPictureSmallOne = (ImageView) convertView
                            .findViewById(R.id.ivSmall1);
                    viewHolder.ivPictureSmallTwo = (ImageView) convertView
                            .findViewById(R.id.ivSmall2);
                    viewHolder.ivPictureSmallOne.setImageBitmap(bmp);
                    viewHolder.ivPictureSmallTwo.setImageBitmap(getItem(position + 1));
                } else {
                    convertView = inflater.inflate(R.layout.feed_listview_big,
                            null);
                    viewHolder.ivPictureBig = (ImageView) convertView
                            .findViewById(R.id.ivBig);
                    viewHolder.ivPictureBig.setImageBitmap(bmp);
                }
            }
            // Return the completed view to render on screen
            return convertView;

        }
    }

【问题讨论】:

  • 您面临的问题是什么?
  • 我刚刚更新了这个问题。我面临的问题是关于分离用于填充每一行的位图。行在 2 个单独的布局之间交替。
  • 尝试查看回收视图

标签: java android listview android-listview bitmap


【解决方案1】:

尝试更改此设置

if (convertView == null) {
    viewHolder = new ViewHolder();
    LayoutInflater inflater = LayoutInflater.from(getContext());
    if (getItemViewType(position) == 0) {
        convertView = inflater.inflate(R.layout.feed_listview_small,
                null);
        viewHolder.ivPictureSmallOne = (ImageView) convertView
                .findViewById(R.id.ivSmall1);
        viewHolder.ivPictureSmallTwo = (ImageView) convertView
                .findViewById(R.id.ivSmall2);
        viewHolder.ivPictureSmallOne.setImageBitmap(bmp);
        viewHolder.ivPictureSmallTwo.setImageBitmap(getItem(position + 1));
    } else {
        convertView = inflater.inflate(R.layout.feed_listview_big,
                null);
        viewHolder.ivPictureBig = (ImageView) convertView
                .findViewById(R.id.ivBig);
        viewHolder.ivPictureBig.setImageBitmap(bmp);
    }
}
// Return the completed view to render on screen
return convertView;

if (convertView == null)
{
    viewHolder = new ViewHolder();
    LayoutInflater inflater = LayoutInflater.from(getContext());
    // Every 3rd image, load the "big" one
    if ((getItemViewType(position) % 3) == 0)
    {
        convertView = inflater.inflate(R.layout.feed_listview_big,
                null);
        viewHolder.ivPictureBig = (ImageView) convertView
                .findViewById(R.id.ivBig);
        viewHolder.ivPictureBig.setImageBitmap(bmp);
    }
    // If not dividable by 3, load the 2 "small" ones
    else
    {
        convertView = inflater.inflate(R.layout.feed_listview_small,
                null);
        viewHolder.ivPictureSmallOne = (ImageView) convertView
                .findViewById(R.id.ivSmall1);
        viewHolder.ivPictureSmallTwo = (ImageView) convertView
                .findViewById(R.id.ivSmall2);
        viewHolder.ivPictureSmallOne.setImageBitmap(bmp);
        viewHolder.ivPictureSmallTwo.setImageBitmap(getItem(position + 1));
    }
}
// Return the completed view to render on screen
return convertView;

【讨论】:

  • 我会保留现有的 getItemViewType 吗?和getViewTypeCount?
  • 我更新了项目详细信息,以反映我所看到的更改结果。这似乎很奇怪,但我会继续努力。如果您有其他想法,请告诉我。
  • 很奇怪...只有每 3 行它应该看起来很大,其他 2 应该看起来很小并且彼此靠近。让我看看我忽略了什么。看来这个if ((getItemViewType(position) % 3) == 0) 表现得很奇怪。我会试试这个:if (((position + 1) % 3) == 0).
  • 原因是位置索引是“off by one”:position = 0, 1, 2 (第三个!), ... 所以,(position + 1) = 1, 2, 3 (第三!位置仍然是 2,但我们检查“加一”版本),...这将使模运算检查正确的项目。
【解决方案2】:

将此添加到您的获取视图中。

 position = MakeNewPosition(position);

make new position 方法将为您提供新的更正位置。

 private int MakeNewPosition(int position)
    {
        return position+(position/2);
    }

希望这行得通。试试看

【讨论】:

  • 不完全。它会导致一些非常奇怪的行为。不过还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多