In my activity I implement a list which contains the names of some files. Every list's item refers to a layout in which I'd like to show the name of the images and a thumbnail of the image referenced. Ican show the the name using an ArrayAdapter but i don't know hot to insert the image thumbnail. All the image referenced stay in sd_card and i have the path of they. Here is the single row layout:
and the layout of the activity
and the activity code inherent adapter.
ArrayAdapter> arrayAdapter = new ArrayAdapter(this,R.layout.row,R.id.titoloTv,targetName); listView.setAdapter(arrayAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView> adapter, final View componente, int pos, long id){ ................... } });
I'm trying using this but doesn't work properly.
String tempTarget; List
回答1:
You need to implement a custom array adapter and specify that imageview and textview layout/id(s) in the adapter.
You don't necessarily need a custom ArrayAdapter, a SimpleAdapter will do the trick for a thumbnail/text combo. You can store the path to the thumbnail and the text you want in a HashMap array, and then apply it using a SimpleAdapter. For example, if you had 5 thumbnails + text and arrays of each:
List> data = new ArrayList>(); for (int i = 0; i datum = new HashMap(2); datum.put("thumbnail", thumbnail[i]); datum.put("name", text[i]); data.add(datum); } YourListViewId.setAdapter(new SimpleAdapter(this, data, R.layout.yoursinglerowlayout, new String[] {"thumbnail","name"}, new int[] {R.id.imageView, R.id.titoloTv}));
回答3:
First: You will have to change your ArrayAdapter to BaseAdapter because BaseAdapter gives you more flexibility with the views. Try to use this code and see how it works:
Here's how I am getting images from sd card and populating it in a listview
public class GetSdCardContent extends Activity { public static Cursor cursor; private int columnIndex; private File file; private String SD_CARD_ROOT; ArrayList f = new ArrayList(); File[] listFile; ImageAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sdcard_layout); getSdcardImages(); ListView lv1 = (ListView) findViewById(R.id.sdlistView1); adapter = new ImageAdapter(); lv1.setAdapter(adapter); } public void getSdcardImages() { File file = new File( android.os.Environment.getExternalStorageDirectory().getPath(), "Pictures"); if (file.isDirectory()) { listFile = file.listFiles(); for (int i = 0; i
This is the adapter I am using. It's a base adapter and I am getting only images for now. You can also add your TextView if you want to.
public class ImageAdapter extends BaseAdapter { private LayoutInflater mInflater; public ImageAdapter() { mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public int getCount() { return f.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.custom_listview_items, null); holder.imageview = (ImageView) convertView .findViewById(R.id.customimageView1); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } Bitmap myBitmap = BitmapFactory.decodeFile(f.get(position)); try { holder.imageview.setImageBitmap(getResizedBitmap(myBitmap, 300, 300)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return convertView; } }
This method is for bitmap. If you want to resize your image and stuff.
public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { int width = bm.getWidth(); int height = bm.getHeight(); float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // CREATE A MATRIX FOR THE MANIPULATION Matrix matrix = new Matrix(); // RESIZE THE BIT MAP matrix.postScale(scaleWidth, scaleHeight); // "RECREATE" THE NEW BITMAP Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); return resizedBitmap; } class ViewHolder { ImageView imageview; } }
Last part: Two layouts.
One: layout for items.
Second: Main Layout. (ListView)
Hope this gives some help..:)
回答4:
I've solved it using this class
public class ExtendedSimpleAdapter extends SimpleAdapter{ List> map; String[] from; int layout; int[] to; Context context; LayoutInflater mInflater; public ExtendedSimpleAdapter(Context context, List> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); layout = resource; map = data; this.from = from; this.to = to; this.context = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); return this.createViewFromResource(position, convertView, parent, layout); } private View createViewFromResource(int position, View convertView, ViewGroup parent, int resource) { View v; if (convertView == null) { v = mInflater.inflate(resource, parent, false); } else { v = convertView; } this.bindView(position, v); return v; } private void bindView(int position, View view) { final Map dataSet = map.get(position); if (dataSet == null) { return; } final ViewBinder binder = super.getViewBinder(); final int count = to.length; for (int i = 0; i " : data.getClass())); } } else if (v instanceof TextView) { // Note: keep the instanceof TextView check at the bottom of these // ifs since a lot of views are TextViews (e.g. CheckBoxes). setViewText((TextView) v, text); } else if (v instanceof ImageView) { if (data instanceof Integer) { setViewImage((ImageView) v, (Integer) data); } else if (data instanceof Bitmap){ setViewImage((ImageView) v, (Bitmap)data); } else { setViewImage((ImageView) v, text); } } else { throw new IllegalStateException(v.getClass().getName() + " is not a " + " view that can be bounds by this SimpleAdapter"); } } } } } private void setViewImage(ImageView v, Bitmap bmp){ v.setImageBitmap(bmp); } }