我有一个自定义列表视图,左边是ImageView,后面是EditText,右边是另一个ImageView,起初没有任何来源。
然后我在这个View上有一个onItemClickListener。我想在项目点击时更改右侧的ImageView源(最初没有任何源的ImageView)。
为此我已实现此代码:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ImageView icone2 = (ImageView) view.findViewById(R.id.icone2_lugar);
icone2.setImageResource(R.drawable.flag_origem);
}
在单击的项目上成功插入ImageView。但是,当我向下滚动列表时,我意识到在滚动列表之前所有其他元素位于单击的位置,也改变了图像资源。
为什么会这样?我想Android会加载新视图作为滚动列表而不是同时加载所有元素视图,所以我想我不能通过获取onItemClick的View参数来更改列表中元素的资源。
那么如何在列表视图中更改被点击元素的资源呢?
编辑:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View linha = convertView;
ArmazenadorLugar armazenador = null;
if (linha == null) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
linha = inflater.inflate(R.layout.linha_lugar, parent, false);
armazenador = new ArmazenadorLugar(linha);
linha.setTag(armazenador);
} else {
armazenador = (ArmazenadorLugar) linha.getTag();
}
armazenador.popularFormulario(mListaLugares.get(position), mContext);
return linha;
}
public LugarAndroid getItem(int position) {
return mListaLugares.get(position);
}
答案 0 :(得分:1)
我最后以不同的方式做到了。不知道它是否更好但是有效。
我在我的适配器中创建了一个变量(imgPosition),它将保存必须设置图像资源的元素位置。然后,每当我点击一个元素时,监听器就会调用
adapter.setImgPosition(position);
adapter.getView(position, view, parent);
我在侦听器中调用了getView方法来刷新列表,因为getView调用了一个方法(我接下来会解释它)来更新列表。 在适配器类的getView方法中,我有以下逻辑(position元素来自getView参数):
holder.setValues(mListaLugares.get(position), mContext, imgPosition == position);
持有人:
static class Holder{
private TextView txt1= null;
private ImageView img1 = null;
private ImageView img2 = null;
Holder(View linha) {
txt1= (TextView) linha.findViewById(R.id.txt1);
img1 = (ImageView) linha.findViewById(R.id.img1 );
img2 = (ImageView) linha.findViewById(R.id.img2);
}
void setValues(LugarAndroid lugar, Context mContext, boolean setImg) {
img2.setImageResource(0);
if(setImg) img2.setImageResource(R.drawable.flag);
// Logic to fill up the others views
}
这样我只会在传递的布尔值为true时设置被点击元素的图像资源
答案 1 :(得分:0)
如果您使用带有List of Object的适配器,则可以使用:
getItem(position)
然后更改此特定对象的imageview图像