Android 如何使用 Drawable 图像名称从 ArrayList<String> 动态设置 ImageViews 源?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21090011/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 03:57:39  来源:igfitidea点击:

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

androidlistviewimageviewdrawable

提问by Sarah Sakamoto

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

我在每行中有一个带有 ImageView、TextView 和另一个 ImageView 的 ListView。

The code below is the xml of my ListView row:

下面的代码是我的 ListView 行的 xml:

<?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.

我有一个 ArrayList < String > ,其中包含我想放在行的第一个 ImageView 中的 Drawables 的名称。我想将 ImageViews 源“ic_default”更改为在 ArrayList 中具有名称的源。

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

在我的活动中,在 onCreate() 中,我使用了一个适配器,如下代码:

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".

感谢您的回答!现在我可以动态更改 ImageView 源(但还不能从 ArrayList < String > )。setImageResource() 方法以前不可用,因为我有一个视图。使用您都建议的 ImageView 演员表,问题的很大一部分是可以的。但是答案并未涵盖“资源名称”的动态内容。

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?

现在最后一个问题是 left.setImageResource(resId); 方法要求从 Resource 获取 ID,而我有一个字符串。怎么做?

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

抱歉,其他代码版本有一些错误。现在它是固定的。我想最后一个问题现在很清楚了。

回答by Shayan Pourvatan

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:

更改 itemsimg 为:

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 drawableIdwith String you can do this:

drawableId使用 String,您可以这样做:

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.

它效率不高,但它可以用来查找偶尔的资源。

回答by Satyaki Mukherjee

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

回答by Rehan

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

回答by Swapnil

Another easy and structured way to do this:

另一种简单且结构化的方法来做到这一点:

1)add the resources in your drawablefolder, lets suppose (ic_home,ic_launcher,ic_logout) //you can add any number of images

1)在你的drawable文件夹中添加资源,让我们假设(ic_home,ic_launcher,ic_logout)//你可以添加任意数量的图像

2)add these names in the strings.xmlpresent in the values folder along with the names which will be displayed besides the image. It would look something like this...

2) 将这些名称添加到 values 文件夹中的strings.xml以及将显示在图像之外的名称中。它看起来像这样......

 <!-- Drawer List Items -->
<string-array name="nav_drawer_items">
    <item>Home</item>
    <item>Add Category</item>
    <item>Logout</item>
</string-array>
<string-array name="nav_drawer_icons">
    <item>ic_home</item>
    <item>ic_addcategory</item>
    <item>ic_logout</item>
</string-array>

3) Now create a pojo(getter/setter) class which will hold the icon text and icon id in a object. Something like this..

3) 现在创建一个 pojo(getter/setter) 类,它将在一个对象中保存图标文本和图标 id。像这样的东西..

public class DrawerItems {

private String icnName;
private int icnId;

/**
 * @return the icnName
 */
public String getIcnName() {
    return icnName;
}

/**
 * @param icnName
 *            the icnName to set
 */
public void setIcnName(String icnName) {
    this.icnName = icnName;
}

/**
 * @return the imageid
 */
public int getIcnId() {
    return icnId;
}

/**
 * @param imageid
 *            the imageid to set
 */
public void setIcnId(int imageid) {
    icnId = imageid;
}}

4) Now we would need to populate this before giving it to the adapter. We could do this in this manner

4)现在我们需要在将其提供给适配器之前填充它。我们可以通过这种方式做到这一点

private DrawerItems navigationDrawerItems;
private ArrayList<DrawerItems> dataObjects;
private String[] mDrawerListItems;
private String[] mDrawerIcons;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // to fetch the resources from the string files
    mDrawerListItems = getResources().getStringArray(
            R.array.nav_drawer_items);
    mDrawerIcons = getResources().getStringArray(R.array.nav_drawer_items);

    // drawerListAdapter = new DrawerListAdapter(this, mDrawerListItems);
    dataObjects = new ArrayList<DrawerItems>();
    for (int i = 0; i < mDrawerListItems.length; i++) {
        navigationDrawerItems = new DrawerItems();
        navigationDrawerItems.setIcnName(mDrawerListItems[i]);
        navigationDrawerItems.setIcnId(getResources().getIdentifier(
                mDrawerIcons[i], "drawable", this.getPackageName()));
        dataObjects.add(navigationDrawerItems);
    }

    drawerListAdapter = new DrawerListAdapter(this,
            R.layout.list_drawer_row_item, dataObjects);//add name of your layout
}

5) Now in adapter you could implement it this way

5)现在在适配器中你可以这样实现

public class DrawerListAdapter extends ArrayAdapter {

公共类 DrawerListAdapter 扩展 ArrayAdapter {

private Context mContext;
private ArrayList<DrawerItems> mDataObjects;
private int layout;

public DrawerListAdapter(Context context, int resource,
        ArrayList<DrawerItems> dataObjects) {
    super(context, resource, dataObjects);
    mContext = context;
    mDataObjects = dataObjects;
    layout = resource;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;

    if (convertView == null) {
        holder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = inflater.inflate(layout, parent,
                false);

        holder.txtDrawerListItem = (TextView) convertView
                .findViewById(R.id.txt_drawer_item_name);
        holder.imgDrawerListIcon = (ImageView) convertView
                .findViewById(R.id.img_drawer_item_icon);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    final DrawerItems dataObj = mDataObjects.get(position);
    holder.txtDrawerListItem.setText(dataObj.getIcnName());
    holder.imgDrawerListIcon.setImageResource(dataObj.getIcnId());

    return convertView;
}

public static class ViewHolder {
    TextView txtDrawerListItem;
    ImageView imgDrawerListIcon;
}
}

6) You are all set...make sure you have initialized views and common stuff

6)你都准备好了……确保你已经初始化了视图和常用的东西