当前位置: 首页 > 知识库问答 >
问题:

网格视图仅显示第一行中的项。对其余部分重复第 0 个项目

白禄
2023-03-14

我遵循了以下线程中接受的答案(来自@kcoppock)中的步骤。https://stackoverflow.com/a/15264039/3296263 或网格视图,包含两列和自动调整大小的图像

编辑:这是代码。网格视图代码:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <GridView 
        android:id="@+id/main_category_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:verticalSpacing="0dp"
        android:horizontalSpacing="0dp"
        android:stretchMode="columnWidth"
        android:numColumns="2"/>
</FrameLayout>

网格项布局:main_category_list_content.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.praz.notespal.model.SquareImageView
    android:id="@+id/picture"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop"/>

<TextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="15dp"
    android:paddingBottom="15dp"
    android:layout_gravity="bottom"
    android:textColor="@android:color/white"
    android:background="#55000000"/>

</FrameLayout>

自定义SquareImageView类:

 public class SquareImageView extends ImageView {
    public SquareImageView(Context context) {
        super(context);
    }

    public SquareImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SquareImageView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); 
    }
}

适配器代码:

private final class MyAdapter extends BaseAdapter {
    private final List<Item> mItems = new ArrayList<Item>();
    private final LayoutInflater mInflater;

    public MyAdapter(Context context) {
        mInflater = LayoutInflater.from(context);

        mItems.add(new Item("Red",       R.drawable.tile_alevel));
        mItems.add(new Item("Magenta",   R.drawable.tile_grade10));
        mItems.add(new Item("Dark Gray", R.drawable.tile_grade11));
        mItems.add(new Item("Gray",      R.drawable.tile_grade9));
        mItems.add(new Item("Green",     R.drawable.tile_alevel));
        mItems.add(new Item("Cyan",      R.drawable.tile_grade11));
    }

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

    @Override
    public Item getItem(int i) {
        return mItems.get(i);
    }

    @Override
    public long getItemId(int i) {
        return mItems.get(i).drawableId;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View v = view;
        ImageView picture;
        TextView name;
        System.out.println("viewing "+ i);

        if (v == null) {
            v = mInflater.inflate(R.layout.main_category_list_content, viewGroup, false);
            v.setTag(R.id.picture, v.findViewById(R.id.picture));
            v.setTag(R.id.text, v.findViewById(R.id.text));
        }

        picture = (ImageView) v.getTag(R.id.picture);
        name = (TextView) v.getTag(R.id.text);

        Item item = getItem(i);

        picture.setImageResource(item.drawableId);
        name.setText(item.name);

        return v;
    }

    private class Item {
        public final String name;
        public final int drawableId;

        Item(String name, int drawableId) {
            this.name = name;
            this.drawableId = drawableId;
        }
    }
}

我设置适配器的活动代码

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    GridView gridView = (GridView)findViewById(R.id.main_category_list);
    gridView.setAdapter(new MyAdapter(this));
}

我没有显示所有6个项目,而是只看到了2个。如果我将“numColumns”属性增加到3,那么它会显示3。所以它只显示第一行。我在适配器的getView()方法中放置了一个控制台,以查看被调用的网格的位置。令我惊讶的是,我看到的是下面的输出。

I/System.out: viewing item 0
I/System.out: viewing item 1
I/System.out: viewing item 0
I/System.out: viewing item 0
I/System.out: viewing item 0
I/System.out: viewing item 0

正如你所看到的,它重复第0个位置,而不是移动到第3。经过大量的搜索,我仍然没有能够弄清楚是怎么回事。非常感谢任何帮助。

请注意,我创建了一个新问题,因为信誉积分不足,我无法回复他的答案。

共有1个答案

宰父疏珂
2023-03-14

我弄清楚了哪里出了问题(当然是偶然的)。问题在于,我的网格视图位于嵌套的Scrol视图中。由于某种原因,这两者不能很好地协同工作。当我将网格视图从嵌套的ScrolView中取出时,它就像一个魅力。我做了一些进一步的搜索,导致这种行为的原因,但我找不到任何线索。无论如何,我真的不想要嵌套的ScrolView,所以现在一切都很好。感谢所有回复的人。如果安提欧知道上述行为的原因,请解释。

 类似资料:
  • 问题就在这里:我创建了世界上最简单的RecyclerView,但它只显示第一个项目。我不明白为什么。谢谢你的帮助。 item_layout.xml mainactivity.java

  • 我有一个RecycerView,它将在设备中安装apk,并与cardview排序,因为标题说我想只在第一个cardview项上显示特定的文本(RecycerView viewholder)

  • 最后是我的适配器类

  • 我需要删除每个表ID的所有重复项,除了一个之外。像下面这样。我需要删除valueid上01,02,03的所有副本。。。 原件: 应该这样结束: 我试着用这样的东西来做,但是我不知道我怎么才能在id上删除这些内容 有什么建议吗? 提前感谢

  • 问题内容: 最近我收到以下错误: 致命异常:NSInternalInconsistencyException无效更新:部分0中的项目数无效。更新(13)之后现有部分中包含的项目数必须等于更新(12)前该部分中包含的项目数,再加上或减去从该部分插入或删除的项目数(插入0,删除0),再加上或减去从该部分移入或移出的项目数(移入0,移出0)。 我的tvOS客户端中的以下代码中发生错误: 我在集合视图中仅

  • 我有一个奇怪的场景,每次我从的第一项中的微调器中选择一个值,最后一个项的微调器值与第一项相同。只有当ListView项目总数为5个及以上时,才会发生这种情况。我注释掉了代码,只保留了声明,但它仍在发生。这是Android系统的漏洞吗? 澄清: > 我的ListView的为空 我的微调器的被注释掉。 Android SDK工具版本为22.6.2 Android SDK平台工具是19.0.1 以下是适