GridView异步展示图片实现单个item刷新

在很多手机软件中都存在一些图片的展示和自定义图片背景,下面就来实现下

布局文件如下

<?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:background="@color/white"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/setting_title"
        android:layout_width="fill_parent"
        android:layout_height="@dimen/workspace_title_height"
        android:background="@color/setting_actionbar" >

        <ImageView
            android:id="@+id/background_list_backImage"
            android:layout_width="48dip"
            android:layout_height="48dip"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:padding="8dip"
            android:src="@drawable/activity_back" 
            android:background="@drawable/activity_onclick_selector"/>

        <TextView
            android:id="@+id/background_list_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/background_list_backImage"
            android:gravity="center_horizontal"
            android:text="@string/change_background"
            android:textColor="@color/white"
            android:textSize="18dip" />
    </RelativeLayout>

    <GridView
        android:id="@+id/background_lis_gridView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:horizontalSpacing="5dp"
        android:numColumns="3"
        android:padding="10dip"
		android:scrollbars="none" 
        android:verticalSpacing="10dp" >
    </GridView>

</LinearLayout>

创建一个活动名为BackgroundListActivity

public class BackgroundListActivity extends Activity {
	private static final int TAKE_PICTURE = 0;
	private static final int RESULT_LOAD_IMAGE = 1;
	private File sdcardTempFile;
	private String mWeather;
	private String mPhotoPath;
	private GridView gridView;
	private ImageView backgroundBack;
	private GridViewBackgroundAdapter adapter;
	//天气背景图片
	private int[] list = { R.drawable.bg_sunny_day, R.drawable.bg_sunny_night,
			R.drawable.bg_cloudy_day, R.drawable.bg_cloudy_night,
			R.drawable.bg_snow_day, R.drawable.bg_snow_night,
			R.drawable.bg_ice_rain, R.drawable.bg_cloudy_sky,
			R.drawable.bg_foggy_day, R.drawable.bg_rain_day,
			R.drawable.bg_thunder_shower, R.drawable.bg_no_data };
	//屏幕的高
	private int mScreenHeight;
	//屏幕的宽
	private int mScreenWidth;
	//点击的位置
	private int location;
	//存储背景的首选项
	private PreferenceWeatherBackground pb;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.background_list_activity);
		Display display = getWindowManager().getDefaultDisplay();
		mScreenHeight = display.getHeight();
		mScreenWidth = display.getWidth();
		//拍照存储图片的文件夹
		mWeather = FileUtil.getSDPath() + "/" + "weather_camera";
		File dir = new File(mWeather);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		pb = new PreferenceWeatherBackground(this);
		initView();
		initEvent();

	}

	private void initView() {
		gridView = (GridView) findViewById(R.id.background_lis_gridView);
		backgroundBack = (ImageView) findViewById(R.id.background_list_backImage);
		//适配器
		adapter = new GridViewBackgroundAdapter(list, this, mScreenHeight,
				mScreenWidth);
		gridView.setAdapter(adapter);
	}

	private void initEvent() {
		//返回键
		backgroundBack.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				finish();
			}
		});
		//item的点击事件
		gridView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				location = position;
				Log.i("jjf", "location111:" + location);
				showCustomDailog(adapter.getWeatherName(position));
			}
		});
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		case TAKE_PICTURE:// 照相
			if (resultCode != -1)
				return;
			savePath(location, mPhotoPath);
			adapter.setImag(gridView, location);
			break;
		case RESULT_LOAD_IMAGE:// 相册
			if (resultCode != -1)
				return;
			Uri selectedImageUri = data.getData();
			if (selectedImageUri == null)
				return;
			String[] filePathColumn = { MediaStore.Images.Media.DATA };
			Cursor cursor = getContentResolver().query(selectedImageUri,
					filePathColumn, null, null, null);
			cursor.moveToFirst();
			int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
			String picturePath = cursor.getString(columnIndex);
			cursor.close();
			savePath(location, picturePath);
			adapter.setImag(gridView, location);
			break;
		}
	}

	private void savePath(int loc, String path) {
		switch (loc) {
		case 0:
			pb.saveSunnyDay(path);// 晴-白天
			break;
		case 1:
			pb.saveSunnyNight(path);// 晴-晚上
			break;
		case 2:
			pb.saveCloudyDay(path);// 多云-白天
			break;
		case 3:
			pb.saveCloudyNight(path);// 多云-晚上
			break;
		case 4:
			pb.saveSnowDay(path);// 雪-白天
			break;
		case 5:
			pb.saveSnowNight(path);// 雪-晚上
			break;
		case 6:
			pb.saveFreezingRain(path);// 冻雨
			break;
		case 7:
			pb.saveCloudy(path);// 阴
			break;
		case 8:
			pb.saveFog(path);// 雾
			break;
		case 9:
			pb.saveRain(path);// 雨
			break;
		case 10:
			pb.saveThunderShower(path);// 雷阵雨
			break;
		case 11:
			pb.saveNoIdea(path);// 未知天气
			break;
		}
	}

	private String getPath(int loc) {
		String path = "";
		switch (loc) {
		case 0:
			path = pb.getSunnyDay();// 晴-白天
			break;
		case 1:
			path = pb.getSunnyNight();// 晴-晚上
			break;
		case 2:
			path = pb.getCloudyDay();// 多云-白天
			break;
		case 3:
			path = pb.getCloudyNight();// 多云-晚上
			break;
		case 4:
			path = pb.getSnowDay();// 雪-白天
			break;
		case 5:
			path = pb.getSnowNight();// 雪-晚上
			break;
		case 6:
			path = pb.getFreezingRain();// 冻雨
			break;
		case 7:
			path = pb.getCloudy();// 阴
			break;
		case 8:
			path = pb.getFog();// 雾
			break;
		case 9:
			path = pb.getRain();// 雨
			break;
		case 10:
			path = pb.getThunderShower();// 雷阵雨
			break;
		case 11:
			path = pb.getNoIdea();// 未知天气
			break;
		}
		return path;
	}
	//拍照,从相册获取照片的对话框
	private void showCustomDailog(String name) {
		//获取所点击位置的名字
		final String imageName = name;
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle(getResources().getString(
				R.string.change_weather_background)
				+ name);
		//引用了一个布局
		final View view = getLayoutInflater().inflate(R.layout.custom_dailog,
				null);
		LinearLayout mPicture = (LinearLayout) view
				.findViewById(R.id.take_a_picture);
		LinearLayout mPhoto = (LinearLayout) view
				.findViewById(R.id.select_a_photo);
		LinearLayout mDefault = (LinearLayout) view
				.findViewById(R.id.restore_defaults);
		builder.setView(view);
		builder.setNegativeButton(
				getResources().getString(R.string.dialog_cancel),
				new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {

					}
				});
		final AlertDialog dialog = builder.create();
		dialog.show();
		mPicture.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {// 拍照
				takePicture(imageName);
				dialog.dismiss();
			}

		});
		mPhoto.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {// 选择照片
				selectPhoto();
				dialog.dismiss();
			}

		});
		mDefault.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {// 恢复默认
				if (!getPath(location).equals("")) {
					savePath(location, "");
					adapter.setImag(gridView, location);
				}
				dialog.dismiss();
			}
		});
	}

	private void takePicture(String str) {
		mPhotoPath = FileUtil.getSDPath() + "/" + "weather_camera/" + str
				+ ".jpg";
		sdcardTempFile = new File(mPhotoPath);
		if (!sdcardTempFile.exists()) {

			try {
				sdcardTempFile.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(sdcardTempFile));
		startActivityForResult(intent, TAKE_PICTURE);
	}

	private void selectPhoto() {
		Intent intent = new Intent(Intent.ACTION_PICK);
		intent.setType("image/*");
		// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
		startActivityForResult(intent, RESULT_LOAD_IMAGE);
	}
}

适配器如下:

public class GridViewBackgroundAdapter extends BaseAdapter {
	//默认图片数组
	private int[] mImages;
	private Context context;
	private LayoutInflater inflater;
	//文字列表
	private String[] list;
	private int Height;
	private int Width;
	//存储图片的首选项
	private PreferenceWeatherBackground pb;

	public GridViewBackgroundAdapter(int[] mImages, Context context,
			int mScreenHeight, int mScreenWidth) {
		super();
		this.mImages = mImages;
		this.context = context;
		//item的高
		Height = (mScreenHeight - 60) / 3;
		//item的宽
		Width = (mScreenWidth - 20) / 3;
		inflater = LayoutInflater.from(context);
		//从资源文件中获取文字列表
		list = context.getResources().getStringArray(R.array.weatherRegime);
		//首选项
		pb = new PreferenceWeatherBackground(context);
	}

	@Override
	public int getCount() {
		return mImages.length;
	}

	@Override
	public Object getItem(int position) {
		return mImages[position];
	}

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

	public String getWeatherName(int position) {
		return list[position];
	}
	//刷新单个item
	public void setImag(GridView grid, int position) {
		if (position >= grid.getFirstVisiblePosition()
				&& position <= grid.getLastVisiblePosition()) {
			View view = grid.getChildAt(position
					- grid.getFirstVisiblePosition());
			ImageView image = (ImageView) view
					.findViewById(R.id.gridview_lsit_item_imageView);
			//判断路径是否为空
			if (!getImagePath(position).equals("")) {
				//判断拍照或选择图片的路径的文件是否存在
				if (FileUtil.isExist(getImagePath(position))) {
					//imageloader异步加载图片
					ImageManager.loadImage("file://" + getImagePath(position),
							image);

				} else {
					//imageloader异步加载图片
					ImageManager.loadImage("drawable://" + mImages[position],
							image);
				}
			} else {
				//imageloader异步加载图片
				ImageManager
						.loadImage("drawable://" + mImages[position], image);
			}
		}
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		if (convertView == null) {
			holder = new ViewHolder();
			convertView = inflater.inflate(
					R.layout.gridview_list_background_item, null);
			holder.imageName = (TextView) convertView
					.findViewById(R.id.gridview_lsit_item_textView);
			holder.image = (ImageView) convertView
					.findViewById(R.id.gridview_lsit_item_imageView);
			LayoutParams para = holder.image.getLayoutParams();
			para.height = Height;
			para.width = Width;
			holder.image.setLayoutParams(para);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		if (!getImagePath(position).equals("")) {
			if (FileUtil.isExist(getImagePath(position))) {
				ImageManager.loadImage("file://" + getImagePath(position),
						holder.image);

			} else {
				ImageManager.loadImage("drawable://" + mImages[position],
						holder.image);
			}
		} else {
			ImageManager.loadImage("drawable://" + mImages[position],
					holder.image);
		}
		holder.imageName.setText(list[position]);
		return convertView;
	}

	public class ViewHolder {
		public ImageView image;
		public TextView imageName;
	}

	private String getImagePath(int i) {
		switch (i) {
		case 0:
			return pb.getSunnyDay();
		case 1:
			return pb.getSunnyNight();
		case 2:
			return pb.getCloudyDay();
		case 3:
			return pb.getCloudyNight();
		case 4:
			return pb.getSnowDay();
		case 5:
			return pb.getSnowNight();
		case 6:
			return pb.getFreezingRain();
		case 7:
			return pb.getCloudy();
		case 8:
			return pb.getFog();
		case 9:
			return pb.getRain();
		case 10:
			return pb.getThunderShower();
		case 11:
			return pb.getNoIdea();
		}
		return "";
	}
}

首选项PreferenceWeatherBackground

public class PreferenceWeatherBackground {
	private static SharedPreferences preferences;
	private Editor editor;
	public static String SUNNY_DAY = "sunny_day";
	public static String SUNNY_NIGHT = "sunny_night";
	public static String CLOUDY_DAY = "cloudy_day";
	public static String CLOUDY_NIGHT = "cloudy_night";
	public static String SNOW_DAY = "snow_day";
	public static String SNOW_NIGHT = "snow_night";
	public static String FREEZING_RAIN = "freezing_rain";
	public static String CLOUDY = "cloudy";
	public static String FOG = "fog";
	public static String RAIN = "rain";
	public static String THUNDER_SHOWER = "thunder_shower";
	public static String NO_IDEA = "no_idea";
	private static PreferenceWeatherBackground pfWeather;

	public PreferenceWeatherBackground(Context context) {
		preferences = context.getSharedPreferences("DeskWeather_Setting",
				Context.MODE_PRIVATE);
		editor = preferences.edit();
	}
	//单例模式
	public static PreferenceWeatherBackground getInstance() {
		
		if (pfWeather == null) {
			pfWeather = new PreferenceWeatherBackground(getApplicationContext(););
		}

		return pfWeather;
	}

	public void saveSunnyDay(String path) {// 晴-白天
		editor.putString(SUNNY_DAY, path);
		editor.commit();
	}

	public String getSunnyDay() {
		return preferences.getString(SUNNY_DAY, "");
	}

	public void saveSunnyNight(String path) {// 晴-晚上
		editor.putString(SUNNY_NIGHT, path);
		editor.commit();
	}

	public String getSunnyNight() {
		return preferences.getString(SUNNY_NIGHT, "");
	}

	public void saveCloudyDay(String path) {// 多云-白天
		editor.putString(CLOUDY_DAY, path);
		editor.commit();
	}

	public String getCloudyDay() {
		return preferences.getString(CLOUDY_DAY, "");
	}

	public void saveCloudyNight(String path) {// 多云-晚上
		editor.putString(CLOUDY_NIGHT, path);
		editor.commit();
	}

	public String getCloudyNight() {
		return preferences.getString(CLOUDY_NIGHT, "");
	}

	public void saveSnowDay(String path) {// 雪-白天
		editor.putString(SNOW_DAY, path);
		editor.commit();
	}

	public String getSnowDay() {
		return preferences.getString(SNOW_DAY, "");
	}

	public void saveSnowNight(String path) {// 雪-晚上
		editor.putString(SNOW_NIGHT, path);
		editor.commit();
	}

	public String getSnowNight() {
		return preferences.getString(SNOW_NIGHT, "");
	}

	public void saveFreezingRain(String path) {// 冻雨
		editor.putString(FREEZING_RAIN, path);
		editor.commit();
	}

	public String getFreezingRain() {
		return preferences.getString(FREEZING_RAIN, "");
	}

	public void saveCloudy(String path) {// 阴
		editor.putString(CLOUDY, path);
		editor.commit();
	}

	public String getCloudy() {
		return preferences.getString(CLOUDY, "");
	}

	public void saveFog(String path) {// 雾
		editor.putString(FOG, path);
		editor.commit();
	}

	public String getFog() {
		return preferences.getString(FOG, "");
	}

	public void saveRain(String path) {// 雨
		editor.putString(RAIN, path);
		editor.commit();
	}

	public String getRain() {
		return preferences.getString(RAIN, "");
	}

	public void saveThunderShower(String path) {// 雷阵雨
		editor.putString(THUNDER_SHOWER, path);
		editor.commit();
	}

	public String getThunderShower() {
		return preferences.getString(THUNDER_SHOWER, "");
	}

	public void saveNoIdea(String path) {// 未知天气
		editor.putString(NO_IDEA, path);
		editor.commit();
	}

	public String getNoIdea() {
		return preferences.getString(NO_IDEA, "");
	}
}

资源名字列表values/arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="weatherRegime">
        <item>晴-白天</item>
        <item>晴-夜晚</item>
        <item>多云-白天</item>
        <item>多云-夜晚</item>
        <item>雪-白天</item>
        <item>雪-夜晚</item>
        <item>冻雨</item>
        <item>阴</item>
        <item>雾</item>
        <item>雨</item>
        <item>雷阵雨</item>
        <item>未知天气</item>
    </string-array>
</resources>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值