使用drawable解析本地xml文件的Android方法

4
我想要解析在Android的assets文件夹中的本地XML文件,我找到了一个非常好的教程:http://theopentutorials.com/tutorials/android/xml/android-simple-xmlpullparser-tutorial/。所有的操作都很顺利,我已经将教程代码转换成了漂亮的listview,每个行项都有一张图片、标题和描述,但是还存在一个大问题:如何解析本地XML文件中的drawable图片以使其加载?所有的图片都存储在drawable文件夹中。
例如XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<cities>
    <city>
        <cid>1</cid>
        <name>Passau</name>
        <image>@drawable/passau</image>
        <desc>Lorem ipsum</desc>
    </city>
    <city>
        <cid>2</cid>
        <name>Bamberg</name>
        <image>@drawable/bamberg</image>
        <desc>Lorem ipsum</desc>
    </city>
    <city>
        <cid>3</cid>
        <name>Augsburg</name>
        <image>@drawable/augsburg</image>
        <desc>Lorem ipsum</desc>
    </city>
</cities>

适配器示例:

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by Ben on 29.07.2014.
 */
public class ListViewAdapter extends ArrayAdapter<RowItem> {
    Context context;

    public ListViewAdapter(Context context, int resourceId,
                               List<RowItem> items) {
        super(context, resourceId, items);
        this.context = context;
    }

    /*private view holder class*/
    private class ViewHolder {
        ImageView imageView;
        TextView txtTitle;
        TextView txtDesc;
    }

    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.row_item, null);
            holder = new ViewHolder();
            holder.txtDesc = (TextView) convertView.findViewById(R.id.Desc);
            holder.txtTitle = (TextView) convertView.findViewById(R.id.Titel);
            holder.imageView = (ImageView) convertView.findViewById(R.id.Bild);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();

        holder.txtDesc.setText(rowItem.getDesc());
        holder.txtTitle.setText(rowItem.getTitle());
        holder.imageView.setImageResource(rowItem.getImageDrawable());

        return convertView;
    }
}
2个回答

2
将您的资源名称添加到xml中,然后尝试以下操作:如果我知道图片名称,如何获取其资源ID?从您从xml中获取的资源名称中获取资源ID。就这样。
根据适配器,在此更改行:
holder.imageView.setImageResource(getContext().getResources().getIdentifier(rowItem.getImage(), "drawable", getContext().getPackageName()));

当您查看:http://developer.android.com/reference/android/widget/ArrayAdapter.html时,它获取上下文并提供方法“getContext”,通过它可以访问资源。
您的RowItem已经保存了图片名称字符串。您需要在xml中删除“@drawable/”前缀。

谢谢。我不知道如何实现这个。我有一个自定义适配器类,一个解析器类和我的数据定义类。我必须在我的定义类中使用String类型,并在我的适配器类中解析整数以持有ImageView,但是我在哪里设置这个:getResources().getIdentifier(mDrawableName , "drawable", getPackageName()); - ben
1
在您的适配器中,您可以使用上下文来访问资源。在您的适配器之后,我将提供示例。 - Rene M.
谢谢,我已经将适配器作为我的问题的编辑添加了。 - ben
非常感谢。我只收到了一个错误,无法解析getpackagename()。 - ben
1
我改了例子,是我的错。getPackageName() 是 context 的一部分,所以你需要 getContext().getPackageName() 或硬编码在你的清单中使用的包名。 - Rene M.
显示剩余2条评论

0

在这里,我将假设您已经拥有了城市作为集合类。您可以通过以下方式收集图像标签来实现此目的。

 else if (tagname.equalsIgnoreCase("image")) {
                    city.setImageDrawable(text);

因此,城市对象将从XML标记中具有此图像值。在适配器中填充视图时,只需从城市对象获取此值,并将其设置为您的ImageView,如下所示-

获取城市对象中设置的图像可绘制值,如下所示-

Drawable imageDrawable = city.getImageDrawablwe();

在你的适配器getView方法中,将图片设置到你的ImageView中。
setBackgroundResource(imageDrawable);

谢谢,但它并没有真正起作用,因为可绘制数据类型无法在else if语句中处理。或者我做错了什么... - ben
我没有运行过这段代码。你必须像这样做。只需检查如何从XML中获取可绘制元素并设置在cities对象中。 - Devendra B. Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接