android listview获取正确的图标

时间:2012-11-18 12:29:03

标签: android listview icons

我有带图标的ListView。每个ListView行都有一个不同的图标或者没有图标。

我能够获得应该拥有它们的行的正确图标,但问题是,在不应该有任何图标的行中有一些图标。

public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
     View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.list_item, null);

        TextView title = (TextView) vi.findViewById(R.id.name);
        ImageView icon = (ImageView) vi.findViewById(R.id.icon);

        HashMap<String, String> item = new HashMap<String, String>();
        item = data.get(position);

        String imgPath = ASSETS_DIR + item.get(myTable.KEY_PIC) + ".png";

            try {
                Bitmap bitmap = BitmapFactory.decodeStream(vi
                        .getResources().getAssets().open(imgPath));
                icon.setImageBitmap(bitmap);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        title.setText(item.get(myTable.KEY_NAME));

    return vi;
}

KEY_PIC总是有一个值,如果KEY_PIC的值只等于某个图标的文件名,那么它应该显示图标。我无法弄清楚如何编码它。我应该在if-else中做点什么我猜。

2 个答案:

答案 0 :(得分:0)

首先,将HashMap<String, String> item = new HashMap<String, String>();放在getView()中,你做了一件坏事。现在你正在为重新显示的每一行创建一个新的,这是不需要的。只需删除它并使用:

String imgPath = ASSETS_DIR + data.get(position).get(myTable.KEY_PIC) + ".png";

老实说,如果你声称你的路径不会导致任何东西,如果不应该显示某些内容,我就无法理解你是如何看到一个图标的。如果它运行良好,那么您可以简单地捕获设置时可能发生的异常并且不执行任何操作。在该位置查看data的实际值应该会产生洞察力。如果是我,我会把null放在那些位置。

临时替代解决方案是为列表视图中的每个位置创建一个布尔数组,然后只有在该位置的值检出时才执行图标设置。

boolean[] varIcon = {
            true, 
            false, 
            false, 
            true,
            false,
            true };
// ...
// then in the getView() now;


if (varIcon[position] == true) {
                String imgPath = ASSETS_DIR + data.get(position).get(myTable.KEY_PIC) + ".png";
                 try {
                        Bitmap bitmap = BitmapFactory.decodeStream(vi
                                .getResources().getAssets().open(imgPath));
                        icon.setImageBitmap(bitmap);

                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }

答案 1 :(得分:0)

可能的问题是视图正在被回收,而您永远不会清除之前设置的图像,请尝试以此来证明:

        String imgPath = ASSETS_DIR + item.get(myTable.KEY_PIC) + ".png";

        try {
            Bitmap bitmap = BitmapFactory.decodeStream(vi
                    .getResources().getAssets().open(imgPath));
            icon.setImageBitmap(bitmap);

        } catch (Exception e) {
            e.printStackTrace();
            icon.setImageDrawable(null);
        }

然而,依靠异常处理获得完全有效的结果并不是一种好的做法(也不是表现友好的)。我建议你让你的myTable.KEY_PIC列返回null,然后你可以这样做:

 String imageName = item.get(myTable.KEYP_PIC);
 if (imageName == null) {
   icon.setImageDrawable(null);
 } else {
   //your code
 }

哪个更干净。