GridView实现图片加载

一、简单写法

activity_example.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <GridView
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnWidth="90dp"
        android:numColumns="auto_fit"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp"
        android:stretchMode="columnWidth"
        android:gravity="center"
        ></GridView>

</LinearLayout>

ExampleActivity.java

package com.administrator.gridviewdemo;


import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.GridView;

import java.util.ArrayList;
import java.util.List;

/**
 * GridView展示文字
 */

public class ExampleActivity extends Activity {

    private GridView gridView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        gridView= (GridView) findViewById(R.id.gridview);
        List<String> strList=new ArrayList<String>();
        for(int i=0;i<9;i++)
        {
            strList.add("haha"+i);
        }
        //最简单的适配器,数组适配器
        ArrayAdapter<String>arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strList);
        gridView.setAdapter(arrayAdapter);
    }
}

二、用GridView展示已安装的应用

(一)、首先需要GridView展示的单条条目布局:

item_grid_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/img_appIcon"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:scaleType="centerCrop"/>
    <TextView
        android:id="@+id/tv_appName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="测试"
        android:layout_marginTop="5dp"/>
</LinearLayout>

(二)、然后需要把在主要引用的页面中,创建GridView用于加载条目的布局位置

activity_example2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <GridView
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnWidth="90dp"
        android:numColumns="3"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp"
        android:stretchMode="columnWidth"
        android:gravity="center"
        />

</LinearLayout>

(三)、需要为GridView增加用于接收数据的实体类

AppInfo.class

package com.administrator.gridviewdemo;

import android.graphics.drawable.Drawable;

/**
 * Created by Administrator on 2018/5/11.
 */

public class AppInfo {
    /**
     * 应用名称
     */
    private String appName;
    /**
     * 应用包名
     */
    private String pacjageName;
    /**
     * 版本名称
     */
    private String versionName;
    /**
     * 版本号
     */
    private int versionCode;
    /**
     * 应用图标
     */
    private Drawable appIcon;

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getPacjageName() {
        return pacjageName;
    }

    public void setPacjageName(String pacjageName) {
        this.pacjageName = pacjageName;
    }

    public String getVersionName() {
        return versionName;
    }

    public void setVersionName(String versionName) {
        this.versionName = versionName;
    }

    public int getVersionCode() {
        return versionCode;
    }

    public void setVersionCode(int versionCode) {
        this.versionCode = versionCode;
    }

    public Drawable getAppIcon() {
        return appIcon;
    }

    public void setAppIcon(Drawable appIcon) {
        this.appIcon = appIcon;
    }
}

(四)、设置GridView的适配器

GridViewAdapter.java

package com.administrator.gridviewdemo;

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

import java.util.List;

/**
 * Created by Administrator on 2018/5/11.
 */

public class GridViewAdapter extends BaseAdapter {

    private Context context;
    private List<AppInfo>appInfoList;
    public GridViewAdapter(Context context, List<AppInfo> appInfoList)
    {
        this.appInfoList=appInfoList;
        this.context=context;
    }

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

    @Override
    public Object getItem(int position) {
        return appInfoList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        if(convertView==null)
        {
            convertView=View.inflate(context, R.layout.item_grid_view,null);
            holder=new ViewHolder();
            holder.img_appIcon= (ImageView) convertView.findViewById(R.id.img_appIcon);
            holder.tv_appName= (TextView) convertView.findViewById(R.id.tv_appName);
            convertView.setTag(holder);
        } else {
            holder= (ViewHolder) convertView.getTag();
        }

        AppInfo appInfo=appInfoList.get(position);
        holder.img_appIcon.setImageDrawable(appInfo.getAppIcon());
        holder.tv_appName.setText(appInfo.getAppName()+" "+appInfo.getVersionName());

        return convertView;
    }

    public class ViewHolder
    {
        ImageView img_appIcon;
        TextView tv_appName;
    }
}

(五)、创建的函数中调用

ExampleActivity2.java

package com.administrator.gridviewdemo;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.GridView;

import java.util.ArrayList;
import java.util.List;

/**
 * 获取应用列表展示
 */
public class ExampleActivity2 extends AppCompatActivity {

    private GridView gridView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example2);
        gridView = (GridView)findViewById(R.id.gridview);
        GridViewAdapter gridViewAdapter = new GridViewAdapter(this,getAppList());
        gridView.setAdapter(gridViewAdapter);
    }
    public List<AppInfo> getAppList() {
        List<AppInfo> appInfoList = new ArrayList<AppInfo>();
        PackageManager packageManager = getPackageManager();
        List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
        for (int i = 0; i < installedPackages.size(); i++) {
            PackageInfo packageInfo = installedPackages.get(i);
            AppInfo appInfo = new AppInfo();
            appInfo.setAppName(packageInfo.applicationInfo.loadLabel(packageManager).toString());
            appInfo.setAppIcon(packageInfo.applicationInfo.loadIcon(packageManager));
            appInfo.setPacjageName(packageInfo.packageName);
            appInfo.setVersionCode(packageInfo.versionCode);
            appInfo.setVersionName(packageInfo.versionName);

//            if ((packageInfo.applicationInfo.flags& ApplicationInfo.FLAG_SYSTEM)==0) {//过滤系统应用的判断
            appInfoList.add(appInfo);
//            }
        }
        return appInfoList;
    }
}

三、用GridView加载网络图片

(一)、添加依赖

build.gradle

dependencies {
    compile 'com.github.bumptech.glide:glide:3.7.0'
}

点击右上角Sync Now

(二)、首先需要GridView展示的单条条目布局:

item_grid_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/img_appIcon"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:scaleType="centerCrop"/>
    <TextView
        android:id="@+id/tv_appName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="测试"
        android:layout_marginTop="5dp"/>
</LinearLayout>

(三)、然后需要把在主要引用的页面中,创建GridView用于加载条目的布局位置

activity_example.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <GridView
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnWidth="90dp"
        android:numColumns="3"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp"
        android:stretchMode="columnWidth"
        android:gravity="center"
        />


</LinearLayout>
(四)、需要为GridView增加用于接收数据的实体类

ImageInfo.java

package com.administrator.gridviewdemo;

import android.graphics.Bitmap;

/**
 * Created by Administrator on 2018/5/11.
 */

public class ImageInfo {
    private String imagePath;
    private Bitmap bitmap;
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getImagePath() {
        return imagePath;
    }

    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }

    public Bitmap getBitmap() {
        return bitmap;
    }

    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }
}

(五)、设置GridView的适配器

GridViewAdapter.java

package com.administrator.gridviewdemo;

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

import com.bumptech.glide.Glide;

import java.util.List;

/**
 * Created by Administrator on 2018/5/11.
 */

public class GridViewAdapter extends BaseAdapter {

    private Context context;
    private List<ImageInfo>imageInfoList;
    public GridViewAdapter(Context context, List<ImageInfo> appImageInfoList)
    {
        this.imageInfoList=appImageInfoList;
        this.context=context;
    }

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

    @Override
    public Object getItem(int position) {
        return imageInfoList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        if(convertView==null)
        {
            convertView=View.inflate(context, R.layout.item_grid_view,null);
            holder=new ViewHolder();
            holder.imageView= (ImageView) convertView.findViewById(R.id.img_appIcon);
            holder.textView= (TextView) convertView.findViewById(R.id.tv_appName);
            convertView.setTag(holder);
        } else {
            holder= (ViewHolder) convertView.getTag();
        }

        ImageInfo imageInfo=imageInfoList.get(position);

        //placeholder()是图片的占位符,网络还没下载下来的时候占着位置
        //centerCrop()缓存
        Glide.with(context).load(imageInfo.getImagePath()).placeholder(R.mipmap.ic_launcher).centerCrop().into(holder.imageView);

//        /**
//         * 加载图片
//         */
//        if(imageInfo.getBitmap()==null){//如果网络还没下载好
//            holder.imageView.setImageResource(R.mipmap.ic_launcher);
//        }else {
//            holder.imageView.setImageBitmap(imageInfo.getBitmap());
//        }
        holder.textView.setText(imageInfo.getText());

        return convertView;
    }

    public class ViewHolder
    {
        ImageView imageView;
        TextView textView;
    }
}

(六)创建的函数中调用

ExampleActivity.java

package com.administrator.gridviewdemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.GridView;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class ExampleActivity extends AppCompatActivity {

    private GridViewAdapter gridAdpter;
    private GridView gridView;
    private List<String> imgList;
    private List<ImageInfo> imageInfoList;
    private ImageLoadTask imageLoadTask;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        initUi();
        initData();
    }

    private void initData() {
        imgList=new ArrayList<String>();
        imgList.add("http://img5.duitang.com/uploads/item/201406/26/20140626164837_dzKds.jpeg");
        imgList.add("http://img2.imgtn.bdimg.com/it/u=3980629563,3881837630&fm=21&gp=0.jpg");
        imgList.add("http://img5q.duitang.com/uploads/item/201505/08/20150508155052_XJaNW.jpeg");
        imgList.add("http://img4.duitang.com/uploads/item/201407/02/20140702105736_FdN5P.jpeg");
        imgList.add("http://img2.imgtn.bdimg.com/it/u=2866652161,3841912673&fm=21&gp=0.jpg");
        imgList.add("http://img4.imgtn.bdimg.com/it/u=883757693,2063816225&fm=21&gp=0.jpg");
        imgList.add("http://cdn.duitang.com/uploads/item/201309/26/20130926110955_QtUdX.jpeg");
        imgList.add("http://zjimg.5054399.com/allimg/160815/14_160815161625_9.jpg");
        imgList.add("http://i-7.vcimg.com/trim/09ce7067d2467c54cf05bbd271ee3ec8430415/trim.jpg");

        imageInfoList = new ArrayList<ImageInfo>();
        for(int i = 0;i<9;i++){
            ImageInfo imageInfo = new ImageInfo();
            imageInfo.setImagePath(imgList.get(i));
            imageInfo.setText("图片"+);
            imageInfoList.add(imageInfo);
        }
        gridAdpter = new GridViewAdapter(this,imageInfoList);
        gridView.setAdapter(gridAdpter);
//        imageLoadTask = new ImageLoadTask(this,gridAdpter);
//        imageLoadTask.execute();//启动
    }

    private void initUi() {
        gridView = (GridView)findViewById(R.id.gridview);
    }
    public Bitmap getImagefromNetWork(String path){
        try {
            URL url = new URL(path);i
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setDoInput(true);
            urlConnection.setConnectTimeout(10*1000);
            urlConnection.connect();
            InputStream inputStream = urlConnection.getInputStream();

            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            inputStream.close();
            return bitmap;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    public class ImageLoadTask extends AsyncTask<String,Void,Void>{

        private GridViewAdapter gridViewAdapter;
        public ImageLoadTask(Context context,GridViewAdapter gridViewAdapter){
            this.gridViewAdapter=gridViewAdapter;
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(String... strings) {
            for (int i = 0;i<gridViewAdapter.getCount();i++){
                ImageInfo imageInfo = (ImageInfo) gridViewAdapter.getItem(i);
                String imagePath = imageInfo.getImagePath();
                Bitmap bitmap = getImagefromNetWork(imagePath);
                imageInfo.setBitmap(bitmap);
                publishProgress();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
            gridViewAdapter.notifyDataSetChanged();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/weimeig/article/details/80284005
今日推荐