Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to force GridView to load cells

GridView is scrolled programmatically, and no new item appears coming up from the bottom.

I tried to update with the following line, but it does not force GridView to load new items.

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

enter image description here


Simplified the app, now the scrolling can be fired with button click, but the upcoming empty items are still appearing. Here is some code:

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();
    }
}
like image 693
János Avatar asked Aug 21 '16 11:08

János


1 Answers

I think the problem is with the way you are scrolling:

gridview.scrollBy(0, 44);

This moves the gridview, not the content of the gridview. You can verify this by adding the following into your layout inside the CustomGridView component:

android:fastScrollAlwaysVisible="true"

Now you can see it's not the gridview content that is being interacted with on the button press.

Instead, I suggest you try to use:

gridview.scrollListBy(44);

if your API level allows it.

like image 53
Caleb Avatar answered Oct 31 '22 16:10

Caleb