Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
315 views
in Technique[技术] by (71.8m points)

java - How can I dynamically add images to a GridView?

I have a GridView that is created based on an array of items. I need to add more images as the grid is scrolled to the bottom, but I'm not sure how to do that.

Now I do understand the following:

  1. I have an adapter which parses the array and provides ImageIds to the class that will return the ImageViews
  2. Somehow I have to change this array and let the adapter know about it, so my question is, how do I get a reference to this adapter?

This is my code:

package com.wm.grid;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.Toast;

public class GridActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final Integer[] mThumbIds12 = {
                R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7,
                R.drawable.sample_0, R.drawable.sample_1,
                R.drawable.sample_2, R.drawable.sample_3,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7,
                R.drawable.sample_0, R.drawable.sample_1,
                R.drawable.sample_2, R.drawable.sample_3,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7
    };
    final Integer[] mThumbIds1 = { 
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
    };
    final GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this,mThumbIds12));
    gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            Toast.makeText(GridActivity.this, "" + position, Toast.LENGTH_SHORT).show();

        }
    });
    gridview.setOnScrollListener(new OnScrollListener() {
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            switch (scrollState) {
            case OnScrollListener.SCROLL_STATE_IDLE:
                //List is idle
                break;
            case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                //Toast.makeText(GridActivity.this, "X", Toast.LENGTH_SHORT).show();
                break;
            case OnScrollListener.SCROLL_STATE_FLING:
                //Toast.makeText(GridActivity.this, "Z", Toast.LENGTH_SHORT).show();
                break;
            }   
        }

        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if(firstVisibleItem + visibleItemCount == totalItemCount){
                Toast.makeText(GridActivity.this, "BOTTOM", Toast.LENGTH_SHORT).show();

            }
            //Toast.makeText(GridActivity.this, "TOP", Toast.LENGTH_SHORT).show();  
        }
    });

}
}

Now there is some redundant code, but this is my testing project. All I know is that the updating of the adapter has to happen when firstVisibleItem + visibleItemCount == totalItemCount (i.e. when the GridView has reached the bottom).

This is my ImageAdapter (based on the Android dev site)

package com.wm.grid;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

import com.wm.grid.R;

public class ImageAdapter extends BaseAdapter {
   private Context mContext;
   private Integer[] mThumbIds;
    public ImageAdapter(Context c,Integer[] m) {
        mContext = c;
        mThumbIds = m;
    }

    public int getCount() {
        return mThumbIds.length;
    }

    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(150, 150));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }
    public Integer[] AddItems(Integer[] a){
        final Integer[] aThumbIds;
        final int i;
        aThumbIds = a;
        Integer[] a2 = new Integer[mThumbIds.length + aThumbIds.length];
        System.arraycopy(mThumbIds, 0, a2, 0, mThumbIds.length);
        System.arraycopy(aThumbIds, 0, a2, mThumbIds.length, aThumbIds.length);
        return mThumbIds;
    }
}

image.xml

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/grid_item_image"
      android:layout_width="50dp"
      android:layout_height="50dp"
      android:src="@drawable/s1"
      >
</ImageView>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/layout1"
>
<LinearLayout
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_weight="1">

<TextView
android:id="@+id/tv1"
android:layout_width="fill_parent"
android:layout_height="40pt"
android:text="row three"
android:textSize="15pt" />

</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<GridView  
android:id="@+id/gridview"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:columnWidth="150dp"
android:numColumns="auto_fit"
android:verticalSpacing="2dp"
android:horizontalSpacing="2dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</LinearLayout>
</LinearLayout>

How should I approach this?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can get reference to the adapter backing the GridView by .getAdapter(). When the user scrolled down, get this adapter, add the new images (I think you should use an ArrayList instead of simple arrays so you can easily append more data in the ImageAdapter class), and call .notifyDatasetChanged() on the now modified adapter, so it'll load in the new data.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...