带有自定义ImageView的XML中的ListView

时间:2014-04-10 20:03:29

标签: android xml listview android-listview

我从XML填充布局。我不太了解这个教程,所以我只能填充TextViews。如何动态地将图像资源分配给每个列表项的ImageView?

我目前正在做的事情:

    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromResource(getApplicationContext(),
            R.raw.symbols);
    Document doc = parser.getDomElement(xml); // getting DOM element

    NodeList nl = doc.getElementsByTagName(KEY_SYMBOL);
    // looping through all item nodes <item>
    for (int i = 0; i < nl.getLength(); i++) {
        // creating new HashMap
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);
        // adding each child node to HashMap key => value
        map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
        map.put(KEY_FILENAME, parser.getValue(e, KEY_FILENAME));
        map.put(KEY_ABBR, parser.getValue(e, KEY_ABBR));
        map.put(KEY_ELEMENT, parser.getValue(e, KEY_ELEMENT));

        // adding HashList to ArrayList
        menuItems.add(map);
    }

    // Adding menuItems to ListView
    ListAdapter adapter = new SimpleAdapter(this, menuItems,
            R.layout.symbol_list_item, new String[] { KEY_NAME,
                    KEY_FILENAME, KEY_ABBR, KEY_ELEMENT }, new int[] {
                    R.id.name, R.id.filename, R.id.abbr, R.id.element });

    setListAdapter(adapter);

如果重要的话,我不仅仅是为ImageView设置drawable。我使用了androidSVG库中的自定义SVGImageView。我在动态提取SVG文件的不同活动上的工作是:

symbolImageView = (SVGImageView) findViewById(R.id.symbolImage);
symbolImageView.setImageResource(this.getResources().getIdentifier(symbol.getFilename(), "raw", this.getPackageName()));

这就是目前我的占位符ImageViews的样子:

enter image description here

2 个答案:

答案 0 :(得分:1)

只是为了得到答案,你的问题是缺少一个适配器来确定列表中的视图并动态设置该视图的背景。 Android提供的简单适配器并没有真正超越基础。它需要一个列表并在屏幕上直观地表示它,它没有很大的灵活性。但是,您可以创建一个扩展适配器的类,如BaseAdapter,然后展开其基本功能。这主要在getView()中完成。基本布局类似于:

public class ListAdapter extends BaseAdapter {
    Context context;
    int resource;
    List<Item> items = new List<Item>();

public ListAdapter(Context context, int resource, List<Item> items) {
    super(context, resource, items);
    this.context = context;
    this.resource = resource;
    this.items = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(resource, parent, false);
    }

    // Dynamically work with each view in the list
}

在此堆栈答案Custom Adapter for List View

中可以看到更复杂的示例

答案 1 :(得分:0)

尝试使用setBackgroundResource代替setImageResource

symbolImageView.setBackgroundResource(this.getResources().getIdentifier(symbol.getFilename(), "raw", this.getPackageName()));