简体   繁体   中英

Android Using GridView with OnScrollListener load 10 images

I'm building a gridview that contains alot of images likely around 1000+ pictures. To reduce the loading time for the gridview, I want to 10 load image tnx

GalleryActivity .java

    public class GalleryActivity extends AppCompatActivity {
    private GridView gridView;
    private GridViewAdapter gridAdapter;
    ArrayList<String> f = new ArrayList<String>();// list of file paths
    File[] listFile;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gallery);

        gridView = (GridView) findViewById(R.id.gridView);
        gridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData());
        gridView.setAdapter(gridAdapter);
        //gridView.setOnScrollChangeListener(new EndlessScrollListener());

        gridView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                ImageItem item = (ImageItem) parent.getItemAtPosition(position);

                //Create intent
                Intent intent = new Intent(GalleryActivity.this, DetailsActivity.class);
                intent.putExtra("title", R.string.text_by + item.getTitle());
                intent.putExtra("subtitle", R.string.text_by + item.getSubtitle());
                intent.putExtra("image", item.getAddress());

                //Start details activity
                startActivity(intent);
            }
        });

        gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(GalleryActivity.this, "333 " + position,
                        Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }
    private ArrayList<ImageItem> getData() {
        final ArrayList<ImageItem> imageItems = new ArrayList<>();
        getFromSdcard();
        for (int i = 0; i < f.size(); i++) {
            Bitmap bitmap = createThumbnailFromBitmap(f.get(i), 200, 200);
            Bitmap bitmapIcon = createThumbnailFromBitmap(f.get(i), 50, 50);
            imageItems.add(new ImageItem(bitmap,bitmapIcon,f.get(i),f.get(i),f.get(i)));
        }
        return imageItems;
    }
    public void getFromSdcard()
    {
        File file= new File(Environment.getExternalStorageDirectory(),"DCIM/Camera");
        if (file.isDirectory())
        {
            listFile = file.listFiles();

            for (int i = 0; i < listFile.length ; i++)
            {
                f.add(listFile[i].getAbsolutePath());
            }
        }
    }
    private Bitmap createThumbnailFromBitmap(Bitmap source, int width, int height){
        //OPTIONS_RECYCLE_INPUT- Constant used to indicate we should recycle the input
        return ThumbnailUtils.extractThumbnail(source, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
    }
    private Bitmap createThumbnailFromBitmap(String filePath, int width, int height){
        return ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(filePath), width, height);
    }
}

ImageItem.java

public class ImageItem {
    private Bitmap image;
    private Bitmap icon;
    private String title;
    private String subtitle;
    private String address;

    public ImageItem(Bitmap image,Bitmap icon, String title, String subtitle,String address) {
        super();
        this.image = image;
        this.icon = icon;
        this.title = title;
        this.subtitle = subtitle;
        this.address = address;
    }
    public Bitmap getImage() {
        return image;
    }
    public void setImage(Bitmap image) {
        this.image = image;
    }
    public Bitmap getIcon() {
        return icon;
    }
    public void setIcon(Bitmap icon) {
        this.icon = icon;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getSubtitle() {
        return subtitle;
    }
    public void setSubtitle(String subtitle) {
        this.subtitle = subtitle;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

GridViewAdapter .java

public class GridViewAdapter extends ArrayAdapter<ImageItem> {

    private Context context;
    private int layoutResourceId;
    private ArrayList<ImageItem> data = new ArrayList<ImageItem>();

    public GridViewAdapter(Context context, int layoutResourceId, ArrayList<ImageItem> data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ViewHolder holder;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new ViewHolder();
            holder.imageTitle = (TextView) row.findViewById(R.id.text_date_card_mochgir);
            holder.subtitle = (TextView) row.findViewById(R.id.secondary_by_card_mochgir);
            holder.image = (ImageView) row.findViewById(R.id.image_card_mochgir);
            holder.icon = (ImageView) row.findViewById(R.id.icon_app_mochgir);
            row.setTag(holder);
        } else {
            holder = (ViewHolder) row.getTag();
        }

        ImageItem item = data.get(position);
        holder.imageTitle.setText(getContext().getResources().getString(R.string.text_date) + item.getTitle());
        holder.subtitle.setText(getContext().getResources().getString(R.string.text_by) + item.getSubtitle());
        holder.image.setImageBitmap(item.getImage());
        holder.icon.setImageBitmap(item.getIcon());

        return row;
    }

    static class ViewHolder {
        TextView imageTitle;
        TextView subtitle;
        ImageView image;
        ImageView icon;
    }
}

.....

<GridView
    android:id="@+id/gridView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnWidth="200dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="4dp"
    android:horizontalSpacing="4dp"
    android:paddingBottom="4dp"
    android:paddingLeft="4dp"
    android:paddingRight="4dp"
    android:paddingTop="4dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
    android:focusable="true"
    android:clickable="true"
    android:contextClickable="true"
    android:drawSelectorOnTop="true"
    android:longClickable="true"/>

I will recommend you use RecyclerView instead and you wont have to worry about the loading time cause recyclerview destroys item that is not in view and loads only what is in view making it fast and efficient.

To setup RecycerView, checkout this post: http://code.tutsplus.com/tutorials/getting-started-with-recyclerview-and-cardview-on-android--cms-23465 Hope this help,

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM