ArrayAdapter text and image

匿名 (未验证) 提交于 2019-12-03 01:12:01

问题:

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> data = new ArrayList>();     for(int i = 0; i map = new HashMap(2);         tempTarget = ar.getAttributeValue("TARGET");         thumbnailBitmap = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(tempTarget), THUMBSIZE, THUMBSIZE);         map.put("thumbnail", thumbnailBitmap);         map.put("titolo", tempTarget);         data.add(map);     }    arIterator= null;     SimpleAdapter simpleAdapter = new SimpleAdapter(this,data,R.layout.row,new String[] {"thumbnail","titolo"},new int[] {R.id.imageView, R.id.titoloTv});       listView.setAdapter(simpleAdapter); 

回答1:

You need to implement a custom array adapter and specify that imageview and textview layout/id(s) in the adapter.

Something like:

  public class CustomListViewAdapter extends ArrayAdapter {       Context context;      public CustomListViewAdapter(Context context, int resourceId, //resourceId=your layout             List items) {         super(context, resourceId, items);         this.context = context;     }      /*private view holder class*/     private class ViewHolder {         ImageView imageView;         TextView txtTitle;     }      public View getView(int position, View convertView, ViewGroup parent) {         ViewHolder holder = null;         RowItem rowItem = getItem(position);          LayoutInflater mInflater = (LayoutInflater) context                 .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);         if (convertView == null) {             convertView = mInflater.inflate(R.layout.list_item, null);             holder = new ViewHolder();             holder.txtTitle = (TextView) convertView.findViewById(R.id.title);             holder.imageView = (ImageView) convertView.findViewById(R.id.icon);             convertView.setTag(holder);         } else             holder = (ViewHolder) convertView.getTag();          holder.txtTitle.setText(rowItem.getTitle());         holder.imageView.setImageResource(rowItem.getImageId());          return convertView;     } }   

And then:

listView = (ListView) findViewById(R.id.list);         CustomListViewAdapter adapter = new CustomListViewAdapter(this,                 R.layout.list_item, rowItems);         listView.setAdapter(adapter);         listView.setOnItemClickListener(this);     }   @Override public void onItemClick(AdapterView> parent, View view, int position,         long id) {     Toast toast = Toast.makeText(getApplicationContext(),         "Item " + (position + 1) + ": " + rowItems.get(position),         Toast.LENGTH_SHORT);     toast.show(); }   

Refer Extending other Adapters too, for ListView(s) and their custom implementation:
Eg. http://theopentutorials.com/tutorials/android/listview/android-custom-listview-with-image-and-text-using-arrayadapter/



回答2:

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); }    } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!