我有带图标的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中做点什么我猜。
答案 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
}
哪个更干净。