Reputation: 2088
I am trying to achieve a Pinterest styled image view like below :
I want the images to be set from a specific folder in my SDCard. I am trying the following code but unable to get the images from a folder(displays a blank white screen).
CODE :
ItemsActivity.java :
private void loadItems(){
String[] leftItems = new String[]{};
String[] rightItems = new String[]{};
ItemsAdapter mAdapter = null;
ArrayList<String> image_items = ItemsAdapter.getImages();
System.out.println("The images are obtained in image_items");
System.out.println("The list of images are" + image_items.toString());
mAdapter = new ItemsAdapter(this,R.layout.item,image_items);
listViewLeft.setAdapter(mAdapter);
listViewRight.setAdapter(mAdapter);
leftViewsHeights = new int[leftItems.length];
rightViewsHeights = new int[rightItems.length];
}
ItemsAdapter.java :
public class ItemsAdapter extends ArrayAdapter<String>{
Context context;
LayoutInflater inflater;
int layoutResourceId;
float imageWidth;
InputStream is;
int item;
public ItemsAdapter(Context context, int layoutResourceId, ArrayList<String> items) {
super(context, layoutResourceId, items);
this.context = context;
this.layoutResourceId = layoutResourceId;
float width = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth();
float margin = (int)convertDpToPixel(10f, (Activity)context);
imageWidth = ((width - (3 * margin)) / 2);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
FrameLayout row = (FrameLayout) convertView;
ItemHolder holder;
String item = getItem(position);
if (row == null) {
holder = new ItemHolder();
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = (FrameLayout) inflater.inflate(layoutResourceId, parent, false);
ImageView itemImage = (ImageView)row.findViewById(R.id.item_image);
holder.itemImage = itemImage;
} else {
holder = (ItemHolder) row.getTag();
}
row.setTag(holder);
setImageBit(item, holder.itemImage);
return row;
}
public static class ItemHolder
{
ImageView itemImage;
}
// resize the image proportionately so it fits the entire space
private void setImageBit(String path, ImageView imageView){
path = android.os.Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "SanPics2";
Bitmap bitmap = BitmapFactory.decodeFile(path);
float i = ((float) imageWidth) / ((float) bitmap.getWidth());
float imageHeight = i * (bitmap.getHeight());
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) imageView.getLayoutParams();
params.height = (int) imageHeight;
params.width = (int) imageWidth;
imageView.setLayoutParams(params);
int count = 10;
String file_name = null;
for(int j = 1;j<count;j++)
{
file_name = "Image " + i + ".jpg";
}
//ArrayList<String> img_bitmap;
//Bitmap bmp = ImgBitFromFile(path, file_name);
imageView.setImageBitmap(bitmap);
}
public static float convertDpToPixel(float dp, Context context){
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float px = dp * (metrics.densityDpi/160f);
return px;
}
public static ArrayList<String> getImages()
{
String path = android.os.Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "SanPics2";
File mainfolder = new File(path);
ArrayList<String> files = new ArrayList<String>();
if(mainfolder.listFiles() == null)
return null;
for(File f : mainfolder.listFiles())
{
if(f.getName().contains(".jpg"))
{
files.add(f.getAbsolutePath());
}
}
return files;
}
I can clearly see that the getImages() method in ItemsAdapter.java retrieves all the images(I had printed those in logcat) but it doesn't seem to set the image in adapter. My logcat is as follows :
01-08 17:30:35.010: E/Trace(14821): error opening trace file: No such file or directory (2)
01-08 17:30:35.040: V/ActivityThread(14821): Class path: /data/app/com.vladimir.pinterestlistview-2.apk, JNI path: /data/data/com.vladimir.pinterestlistview/lib
01-08 17:30:35.100: I/System.out(14821): The images are got in image_items
01-08 17:30:35.100: I/System.out(14821): The list of images are[/storage/sdcard0/Pictures/SanPics2/Image 7.jpg, /storage/sdcard0/Pictures/SanPics2/Image 1.jpg, /storage/sdcard0/Pictures/SanPics2/Image 2.jpg, /storage/sdcard0/Pictures/SanPics2/Image 3.jpg, /storage/sdcard0/Pictures/SanPics2/Image 4.jpg, /storage/sdcard0/Pictures/SanPics2/Image 5.jpg, /storage/sdcard0/Pictures/SanPics2/Image 8.jpg, /storage/sdcard0/Pictures/SanPics2/1388143033275.jpg, /storage/sdcard0/Pictures/SanPics2/1388143591263.jpg, /storage/sdcard0/Pictures/SanPics2/1388143312172.jpg, /storage/sdcard0/Pictures/SanPics2/1388143530089.jpg, /storage/sdcard0/Pictures/SanPics2/Image 6.jpg]
01-08 17:30:35.230: I/Adreno200-EGL(14821): <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB_REL_2.0.3_RB3.04.01.01.42.002_msm8625_JB_REL_2.0.3_Merge_release_AU (Merge)
01-08 17:30:35.230: I/Adreno200-EGL(14821): Build Date: 12/12/12 Wed
01-08 17:30:35.230: I/Adreno200-EGL(14821): Local Branch:
01-08 17:30:35.230: I/Adreno200-EGL(14821): Remote Branch: m/jb_rel_2.0.3
01-08 17:30:35.230: I/Adreno200-EGL(14821): Local Patches: NONE
01-08 17:30:35.230: I/Adreno200-EGL(14821): Reconstruct Branch: AU_LINUX_ANDROID_JB_REL_2.0.3_RB3.04.01.01.42.002 + NOTHING
01-08 17:30:35.310: E/ViewRootImpl(14821): performLayout : host is null
01-08 17:30:35.330: E/ViewRootImpl(14821): performLayout : host is null
01-08 17:30:35.340: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(0, 0 - 480, 800)
01-08 17:30:40.620: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(0, 0 - 480, 800)
01-08 17:30:40.840: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:41.040: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:41.250: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:41.450: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:41.670: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:41.920: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:42.220: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:42.660: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:43.280: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:43.860: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:44.390: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:44.690: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
01-08 17:30:45.090: D/HardwareRenderer(14821): draw surface is valid dirty= Rect(15, 110 - 240, 800)
This draw statement in log cat repeats itself when I touch the screen. I am not sure what I'm missing; whether something big or something silly. How do I get my cam images to be set in the above depicted style ? Any help would be much appreciated guys. Thanks in advance.
P.S : I am using two synchronized list views to display the images and they are scrollable at the same time.
Upvotes: 1
Views: 472
Reputation: 23638
Check out StaggerdGridView which is same as you need and its easy to implement.
Upvotes: 1