How to set ImageViews source dynamically from ArrayList<String> with Drawable image name?

33,041

Solution 1

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.scenesrow, R.id.text, items) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
        View row =  super.getView(position, convertView, parent);
        ImageView left = (ImageView)row.findViewById(R.id.left);
        left.setOnClickListener(ScenesActivity.this);
        ImageView right = (ImageView)row.findViewById(R.id.right);
        right.setTag(position);

       right.setImageResource(itemsimg.get(position));
       left.setImageResource(itemsimg.get(position));

       right.setOnClickListener(ScenesActivity.this);
       return row;
    }

change itemsimg with:

ArrayList<Integer> itemsimg = new ArrayList<Integer>();
itemsimg.add(R.drawable.ic_star);
itemsimg.add(R.drawable.ic_moon);
itemsimg.add(R.drawable.ic_dog);
itemsimg.add(R.drawable.ic_bird);
itemsimg.add(R.drawable.ic_tree);

for getting drawableId with String you can do this:

Context context = imageView.getContext();
int id = context.getResources().getIdentifier("ic_tree", "drawable", context.getPackageName());
imageView.setImageResource(id);

It's not efficient, but it works to look up occasional resources.

Solution 2

Try this::

right.setImageResource(R.drawable.addphoto);/*select a picture from drawable*/

same for left also

left.setImageResource(R.drawable.addphoto);/*select a picture from drawable*/

After Discussion

       ArrayList<String> items = new ArrayList();
    items.add("ic_star");
    items.add("ic_moon");
    items.add("ic_dog");
    items.add("ic_bird");
    items.add("ic_tree");
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.scenesrow, R.id.text, items) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View row =  super.getView(position, convertView, parent);
/*View : not required to declare everytimes*/
                ImageView left = row.findViewById(R.id.left);
                left.setOnClickListener(ScenesActivity.this);
                ImageView right = row.findViewById(R.id.right);
                right.setTag(position);
                right.setOnClickListener(ScenesActivity.this);
                right.setImageResource(R.drawable.addphoto);/*select a picture from drawable*/
                left.setImageResource(R.drawable.addphoto);/*select a picture from drawable*/

                return row;
            }
        };

Solution 3

Replace your code like this:

ArrayList<String> items = new ArrayList();
items.add("ic_star");
items.add("ic_moon");
items.add("ic_dog");
items.add("ic_bird");
items.add("ic_tree");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.scenesrow, R.id.text, items) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row =  super.getView(position, convertView, parent);
            ImageView left = (ImageView) row.findViewById(R.id.left);
            left.setOnClickListener(ScenesActivity.this);
            left.setImageResource(R.drawable.leftphoto);
            ImageView right = (ImageView) row.findViewById(R.id.right);
            right.setTag(position);
            right.setOnClickListener(ScenesActivity.this);
            right.setImageResource(R.drawable.rightphoto);
            return row;
        }
    };
Share:
33,041
Sarah Sakamoto
Author by

Sarah Sakamoto

Updated on August 02, 2022

Comments

  • Sarah Sakamoto
    Sarah Sakamoto almost 2 years

    I have a ListView with an ImageView, a TextView and another ImageView in each row.

    The code below is the xml of my ListView row:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:background="#FFF">
    <ImageView
    android:id="@+id/left"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_gravity="center"
    android:src="@drawable/ic_default"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp" />
    <TextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:layout_weight="1"
    android:textSize="16sp" />
    <ImageView
    android:id="@+id/right"
    android:layout_width="50dp"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:src="@drawable/ic_cena_play"
    android:layout_marginRight="0dp"
    android:layout_marginLeft="10dp"
    android:clickable="true"
    android:background="@drawable/mybuttonplay" />
    </LinearLayout>
    

    I have an ArrayList < String > with the names of Drawables I want to put in the first ImageView of the rows. I want to change the ImageViews source "ic_default" to the ones which have the name in ArrayList, dinamically.

    In my Activity, inside onCreate(), I am using an Adapter, as the code below:

    ArrayList<String> items = new ArrayList();
    items.add("Star");
    items.add("Moon");
    items.add("Dog");
    items.add("Bird");
    items.add("Tree");
    ArrayList<String> itemsimg = new ArrayList();
    itemsimg.add("ic_star");
    itemsimg.add("ic_moon");
    itemsimg.add("ic_dog");
    itemsimg.add("ic_bird");
    itemsimg.add("ic_tree");
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.scenesrow, R.id.text, items) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View row =  super.getView(position, convertView, parent);
                ImageView left = (ImageView) row.findViewById(R.id.left);
                //here I want to change the resource
                //Like if I had a function called getRosourceId(). DOES IT EXIST?!
                int x = getResourceId( itemsimg.get(position) );
                left.setImageResource(x);
                View right = row.findViewById(R.id.right);
                right.setTag(position);
                right.setOnClickListener(ScenesActivity.this);
                return row;
            }
        };
    

    Updated

    Thanks for answers! Now I can change the ImageView source dinamically (but not yet from the ArrayList < String >). The setImageResource() method was not available before because I had a View. With the cast to ImageView you all suggested, big part of the problem was okay. But the answers do not cover the dinamically thing of the "name of the resource".

    The last problem now is the left.setImageResource(resId); method asks for an ID from Resource, and I have a String. How to do it?

    And sorry, other code version had some mistakes. Now it is fixed. I think the last problem is clear now.

  • Sarah Sakamoto
    Sarah Sakamoto over 10 years
    The problem is the method setImageResource() is not available
  • Sarah Sakamoto
    Sarah Sakamoto over 10 years
    Now I got the Bitmap, but without the method to set the image resource, I dont know what to do.
  • Satyaki Mukherjee
    Satyaki Mukherjee over 10 years
    Your problem is Adapter class. there is some mistake in adapter class. I will let you know
  • Satyaki Mukherjee
    Satyaki Mukherjee over 10 years
    please post full adapter class. Your adapter class is not in proper way
  • Sarah Sakamoto
    Sarah Sakamoto over 10 years
    That is not a way to get the "R.drawable.ic_star" integer from a string "ic_star"? I think it should resolve the last problem.
  • Shayan Pourvatan
    Shayan Pourvatan over 10 years
    you must use Integer and if you need last part ("ic_star") you need use substring method to get that , or store in another Array
  • Shayan Pourvatan
    Shayan Pourvatan over 10 years
    see my Edit @SarahSakamoto and change the itemsImg
  • Sarah Sakamoto
    Sarah Sakamoto over 10 years
    But this way you are inserting the integers from Drawable, not getting it dynamically based on String information. I want a way to convert strings into the respective drawable resource id. Is there a way to do it?