我查看了Stackoverflow,有些人询问有关更改图像的问题,但是没有解决方案对我有帮助。
我在列表视图的listItem中有一个ImageButton
。我想在点击ImageButton
时更改ImageButton
的图片。它正在显示吐司但不会改变图像。
任何帮助将不胜感激。提前谢谢。
以下是我的代码......
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.fragment_contacts_item_list, null);
contactName = (TextView)rowView.findViewById(R.id.name_contact);
contactNumber = (TextView)rowView.findViewById(R.id.number_contact);
contactPic = (ImageView)rowView.findViewById(R.id.quickContactBadge_contact);
contactStatusButton = (ImageButton)rowView.findViewById(R.id.configuration_button);
convertView = rowView;
contactArray = new ArrayList<ContactModel>();
int status = contactList.get(position).getButtonStatus();
if(status == 0)
contactStatusButton.setImageResource(R.drawable.grey);
else if(status == 1) //toggle button is on
contactStatusButton.setImageResource(R.drawable.green);
else
contactStatusButton.setImageResource(R.drawable.red);
contactStatusButton.setVisibility(View.VISIBLE);
contactStatusButton.setBackgroundColor(Color.TRANSPARENT);
contactStatusButton.setTag(position);
contactStatusButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
int position = (Integer) view.getTag();
model.setName(contactList.get(position).getName());
model.setNumber(contactList.get(position).getNumber());
model.setPhoto(contactList.get(position).getPhoto());
ContactAdapter.contactArray.add(contactList.get(position));
contactStatusButton.setImageResource(R.drawable.green);
Toast.makeText(context, "contact Number: " + contactList.get(position).getNumber(), Toast.LENGTH_SHORT).show();
}
});
model = new ContactModel(contactList.get(position).getName(), contactList.get(position).getNumber(), 0);
model.setName(contactList.get(position).getName());
model.setNumber(contactList.get(position).getNumber());
model.setButtonStatus(contactList.get(position).getButtonStatus());
Bitmap pic = Utilities.getPhoto(contactList.get(position).getPhoto());
model.setPhoto(contactList.get(position).getPhoto());
contactName.setText(contactList.get(position).getName());
contactNumber.setText(contactList.get(position).getNumber());
contactPic.setImageBitmap(pic);
return convertView;
}
答案 0 :(得分:1)
您的观点似乎都被定义为封闭类的成员。这意味着无论何时调用getView,它们都会不断被重新分配给不同的视图。
相反,您应该在本地将视图分配给方法,并将它们设置为final,以便可以在单击处理程序中引用它们:
final View rowView = inflater.inflate(R.layout.fragment_contacts_item_list, null);
final TextView contactName = (TextView)rowView.findViewById(R.id.name_contact);
final TextView contactNumber = (TextView)rowView.findViewById(R.id.number_contact);
final ImageView contactPic = (ImageView)rowView.findViewById(R.id.quickContactBadge_contact);
final ImageButton contactStatusButton = (ImageButton)rowView.findViewById(R.id.configuration_button);
您在点击处理程序中也使用model
犯了同样的错误。您需要确保使用与该行关联的模型,而不是在类成员中保留的模型。
此外,您应该注意到您实际上并没有回收行。你每次都在创建一个新行。这违背了ListView的主要目的之一,即不必为每一行创建新视图。您可能希望找到其中一个ListView教程,以帮助您正确执行此操作。
答案 1 :(得分:-1)
我认为在您更新其图像资源后,它将主要解决您使视图无效的问题。试试你的onClick():
@Override
public void onClick(View view) {
int position = (Integer) view.getTag();
model.setName(contactList.get(position).getName());
model.setNumber(contactList.get(position).getNumber());
model.setPhoto(contactList.get(position).getPhoto());
ContactAdapter.contactArray.add(contactList.get(position));
contactStatusButton.setImageResource(R.drawable.green);
contactStatusButton.invalidate(); //The View now needs to be redrawn
Toast.makeText(context, "contact Number: " + contactList.get(position).getNumber(), Toast.LENGTH_SHORT).show();
}