1

ArrayAdapterをカスタマイズする代わりに、SimpleAdapterを使用したいと思います。各行に関連付けられているアイコンを除いて、すべてが機能しています。アイコンはラベルに直接関連しています。そのため、ラベルによってはアイコンが異なる場合があります。

これがサンプルXMLです

<profile>
<id>16</id>
<name>Random Name</name>
<site>Random URL</site>
<icon>R.drawable.random_icon</icon>
</profile>

私のカスタム行レイアウト

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" >

<ImageView
    android:id="@+id/icon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@+id/label" />

<ImageView
    android:id="@+id/arrow"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/arrow" />

</LinearLayout>

ここで、XMLを解析し、アダプターをセットアップします(関連する部分だけに編集されています)。

        NodeList children = doc.getElementsByTagName("profile");

    for (int i = 0; i < children.getLength(); i++) {

            HashMap<String, String> map = new HashMap<String, String>();

                    Element e = (Element) children.item(i);

                    map.put("id", ParseXMLMethods.getValue(e, "id"));
        map.put("name", ParseXMLMethods.getValue(e, "name"));
        map.put("site", ParseXMLMethods.getValue(e, "site"));
        map.put("icon", ParseXMLMethods.getValue(e, "icon"));
        mylist.add(map);
    }

           View header = getLayoutInflater().inflate(R.layout.header, null, false);

       ListAdapter adapter = new SimpleAdapter(this, mylist,
            R.layout.rowlayout, new String[] { "name", "icon" }, new int[] { R.id.label, R.id.icon });


    final ListView lv = getListView();
    lv.addHeaderView(header, null, false);
    lv.setSelector(R.color.list_selector);
    setListAdapter(adapter);

プログラムはクラッシュしません。すべてがそのまま表示されます。「サイト」を解析することもできるので、行をクリックするとWebビューが開きます。アイコンを表示できません。SimpleAdapterでもこれは可能ですか?

更新:これはオーバーライドされたgetView()メソッドです:

public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);

    int idImage = context.getResources().getIdentifier("icon","drawable", context.getPackageName());

    //   ????????

    return view;
}
4

1 に答える 1

0

これを実現するには、拡張された SimpleAdapter のリソースからgetIdentifierメソッドを使用することをお勧めします。ただし、そのためには、まず xml を少し変更する必要があります。

画像のプログラム可能な参照を xml に保存する代わりに、ファイル名を保存するだけです。

<profile>
  <id>16</id>
  <name>Random Name</name>
  <site>Random URL</site>
  <icon>random_icon</icon>
</profile>

ここで、SimpleAdapter を独自のアダプター クラスとオーバーライドgetViewメソッドに拡張します。そのメソッドでは、名前からリソース ID を再構築し、それを ImageView に設定できます。

int idImage = context.getResources().getIdentifier("nameOfResource", "drawable", context.getPackageName());

アップデート

public class MyAdapter extends SimpleAdapter {

    private Context context;

    List<HashMap<String, String>> lstData = new ArrayList<HashMap<String,String>>();

    public MyAdapter(Context context, List<HashMap<String, String>> items) {
        super(context, items, android.R.id.text1, R.layout.rowlayout, new String[] { "name", "icon" }, new int[] { R.id.label, R.id.icon });

        this.context = context;
        lstData = items;
    }




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

        //smart initialization      
        if(convertView == null){
            LayoutInflater inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflator.inflate(R.layout.rowlayout, parent, false);

            holder = new ViewHolder();
            holder.title = (TextView) convertView.findViewById(R.id.label);
            holder.img = (ImageView) convertView.findViewById(R.id.icon);
            convertView.setTag(holder);
        }
        else
            holder = (ViewHolder) convertView.getTag();

        //get item
        HashMap<String, String> map = lstData.get(position);

        //setting title
        holder.title.setText(map.get("name"));

        int idImage = context.getResources().getIdentifier(map.get("icon"),"drawable", context.getPackageName());
        holder.img.setImageResource(idImage);

        return convertView;
    }



    //this is better approach as suggested by Google-IO for ListView
    private static class ViewHolder{
        TextView title;
        ImageView img;
    }

}

*このクラス コードは、アダプタがどのように見えるかを確認するための参照用です。より適切な方法は ArrayAdapter を使用することですが、すでに SimpleAdapter を使用しているため、その機能を拡張しました

于 2012-03-29T06:25:29.010 に答える