【发布时间】:2014-08-18 09:25:37
【问题描述】:
GridView 已被名为“MyDir”的特定文件夹的内容填充。我的布局 gallery_fragment 被两个线性布局分成两半。左侧的 GridView 已经填充了来自“MyDir”的图像。右边的布局有一个 ImageView。
我的想法是我可以从左侧的 GridView 中选择一个图像,然后它将出现在右侧的 ImageView 上。在这种情况下,我无法使用 res/drawables 文件夹。
有人告诉我我需要使用 HashMap hMap; 有人有什么建议吗?
public class GalleryFragment4 extends Fragment {
private ImageView imageView;
private ImageGridViewAdapter imageAdapter;
private GridView gridView;
private static final String GRIDVIEW_TAG = "Android Logo";
@SuppressLint("UseSparseArrays")
public HashMap<Integer, String> hMap = new HashMap<Integer, String>();
// private LinearLayout linear;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_gallery, container,
false);
// assigns gridView to an object
gridView = (GridView) rootView.findViewById(R.id.gridview);
gridArchitecture(rootView);
extractFiles();
/**
* GridView is waiting for an image to be selected
*/
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// image number
int num = (position + 1);
// When image is selected show image number
Toast.makeText(getActivity().getApplicationContext(),
"image : " + num, Toast.LENGTH_SHORT).show();
((Context) getCameraImages(getActivity())).getApplicationContext();
try{
imageView.setImageResource(position);
}catch(NullPointerException ex){
}
}
});
return rootView;
}
/*
* Save image to external SD card and create new file if said file is not
* already created
*/
public static final String DIRECTORY_PATH = Environment
.getExternalStorageDirectory().toString() + "/MyDir/";
// public static final String CAMER_IMAGE_BUCKET_ID = getBucketId(DIRECTORY_PATH);
/**
* Matches code in MediaProvider.computeBucketValues. Should be a common
* function.
*/
// public static String getBucketId(String path) {
// return String.valueOf(path.toLowerCase().hashCode());
// }
/**
* Retrieve all camera images
*
* @param context
* @return
*/
public static List<String> getCameraImages(Context context) {
final String[] projection = { MediaStore.Images.Media.DATA };
final String selection = MediaStore.Images.Media.BUCKET_ID + " = ?";
final String[] selectionArgs = { DIRECTORY_PATH };
final Cursor cursor = context.getContentResolver().query(
Images.Media.EXTERNAL_CONTENT_URI, projection, selection,
selectionArgs, null);
ArrayList<String> result = new ArrayList<String>(cursor.getCount());
if (cursor.moveToFirst()) {
final int dataColumn = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
do {
final String data = cursor.getString(dataColumn);
result.add(data);
} while (cursor.moveToNext());
}
cursor.close();
return result;
}
private void extractFiles() {
// Name of the folder
final String targetPath = DIRECTORY_PATH;
// Toast showing name of directory which images are saved to.
Toast.makeText(getActivity().getApplicationContext(), targetPath,
Toast.LENGTH_LONG).show();
File targetDirector = new File(targetPath);
final File[] files = targetDirector.listFiles();
for (File file : files) {
imageAdapter.add(file.getAbsolutePath());
}
}
private void gridArchitecture(View rootView) {
// Sets the Tag
gridView.setTag(GRIDVIEW_TAG);
/*
* Adapt the image for the GridView format
*/
imageAdapter = new ImageGridViewAdapter(getActivity()
.getApplicationContext());
gridView.setAdapter(imageAdapter);
// Set the orientation to landscape
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
如果这里有任何用处的话就是 ImageGridviewAdapter.java
public class ImageGridViewAdapter extends BaseAdapter {
private Context context;
ArrayList<String> imageList = new ArrayList<String>();
public ImageGridViewAdapter(Context c) {
context = c;
}
void add(String path){
imageList.add(path);
}
@Override
public int getCount() {
return imageList.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(context);
imageView.setLayoutParams(new GridView.LayoutParams(220, 220));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
//8,8,8,8
imageView.setPadding(20, 20, 20, 20);
} else {
imageView = (ImageView) convertView;
}
// 200, 200
Bitmap bm = decodeSampledBitmapFromUri(imageList.get(position), 100, 100);
imageView.setImageBitmap(bm);
return imageView;
}
public Bitmap decodeSampledBitmapFromUri(String path, int reqWidth, int reqHeight) {
Bitmap bm = null;
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
bm = BitmapFactory.decodeFile(path, options);
return bm;
}
public int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
return inSampleSize;
}
}
这里是 xml fragment_gallery.xml
<?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:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/darkblue"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/center_point"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_centerInParent="true"
android:orientation="horizontal" />
<LinearLayout
android:id="@+id/right_linear"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toRightOf="@+id/center_point"
android:background="@drawable/normal_shape" >
<ImageView
android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="320dp"
android:contentDescription="@drawable/android_icon"
android:src="@drawable/android_icon" />
</LinearLayout>
<LinearLayout
android:id="@+id/left_linear"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignRight="@+id/center_point" >
<GridView
android:id="@+id/gridview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:columnWidth="50dp"
android:gravity="center"
android:horizontalSpacing="10dip"
android:numColumns="2"
android:stretchMode="columnWidth"
android:verticalSpacing="10dip" >
</GridView>
</LinearLayout>
</RelativeLayout>
【问题讨论】:
-
嘿,当您单击 Grid 获取位置并使用该位置参考获取图像并设置为右侧的图像视图时尝试一下。
-
你能给我一个可以为我指明正确方向的代码吗?以前我一直在使用 imageView.setImageResource(position);这被证明是无效的。感谢您的及时回复。
-
在此处添加您的完整代码
-
编辑就这样,问题可以从 GalleryFragment4 解决,但我有其他文件可以让您更好地了解系统。
标签: android gridview hashmap imageview