android - 如何强制 GridView 加载单元格

标签 android gridview

GridView 以编程方式滚动,并且没有新项目从底部出现。

我尝试使用以下行进行更新,但它不会强制 GridView 加载新项目。

imageAdapter.notifyDataSetChanged();
gridview.invalidateViews();
gridview.setAdapter(imageAdapter);

enter image description here


简化了应用程序,现在可以通过单击按钮触发滚动,但是即将出现的空项目仍然出现。这是一些代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final CustomGridView gridview = (CustomGridView) findViewById(R.id.gridView1);
        final ImageAdapter imageAdapter = new ImageAdapter(this);
        gridview.setAdapter(imageAdapter);

        gridview.setNumColumns(3);
        LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams)gridview.getLayoutParams();
        linearParams.width=66*3;
        gridview.setLayoutParams(linearParams);


        final Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                gridview.scrollBy(0, 44);
            }
        });
    }

public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {

        return 300;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(66, 66));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(0, 0, 0, 0); // 8 8 8 8
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(R.drawable.asdf);
        return imageView;
    }
}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.j4nos.moviebuffs12.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <HorizontalScrollView
        android:id="@+id/horizontalScrollView"
        android:layout_width="198dp"
        android:layout_height="match_parent"
        android:layout_marginTop="66dp"
        android:layout_marginLeft="0dp"
        android:layout_marginBottom="0dp">

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

            <com.j4nos.moviebuffs12.CustomGridView
                android:id="@+id/gridView1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_margin="0dp"
                android:columnWidth="66dp"

                android:horizontalSpacing="0dp"
                android:scrollbarAlwaysDrawHorizontalTrack="true"
                android:scrollbarAlwaysDrawVerticalTrack="true"
                android:scrollbars="horizontal"
                android:stretchMode="none"
                android:verticalSpacing="0dp"
                android:listSelector="@null"
                android:scaleType="centerCrop">

            </com.j4nos.moviebuffs12.CustomGridView>

        </LinearLayout>

    </HorizontalScrollView>

</RelativeLayout>

public class CustomGridView extends GridView {

    public CustomGridView(Context context) {
        super(context);
    }

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

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

    /* ADD THIS */
    @Override
    public int computeVerticalScrollOffset() {
        return super.computeVerticalScrollOffset();
    }
}

最佳答案

我认为问题在于您滚动的方式:

gridview.scrollBy(0, 44);

这会移动 gridview,而不是 gridview 的内容。您可以通过将以下内容添加到 CustomGridView 组件内的布局中来验证这一点:

android:fastScrollAlwaysVisible="true"

现在您可以看到在按下按钮时与之交互的不是 gridview 内容。

相反,我建议您尝试使用:

gridview.scrollListBy(44);

如果您的 API 级别允许的话。

关于android - 如何强制 GridView 加载单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39063719/

相关文章:

c# - 如何根据条件更改 DataGridview 中的列前景色?

android - 在 Android Gridview 中显示复合项目

android渲染用户手指的轨迹

android - 由于 Youtube API 问题,应用已从 Google Play 下架

java - 从 ListView 获取选中的元素

javascript - Yii2-在gridview中使用多个复选框

Android - 带有自定义 BaseAdapter 的 Gridview,点击查看位置

android - 如何获取谷歌地图的当前填充(Android API)

android - 如何禁止 ViewPager 向一个方向滑动

java - 清除共享首选项