在列表视图中更改图像按钮的图像
Change Image of image button in list view
我查看了 Whosebug,有人问我要不要更改图像,但没有一个解决方案对我有帮助。
我在列表视图的 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;
}
我认为在更新其图像资源后使视图无效将主要解决您的问题。试试你的 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();
}
您的视图似乎都被定义为封闭 class 的成员。这意味着每当调用 getView 时,它们都会不断地重新分配给不同的视图。
相反,您应该在本地将您的视图分配给该方法,并使它们最终化,以便它们可以在您的点击处理程序中被引用:
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
也犯了同样的错误。您需要确保您使用的是与该行相关联的模型,而不是恰好留在 class 成员中的任何模型。
另外,您应该注意您实际上并没有回收这些行。您每次都在创建一个新行。这违背了 ListView 的主要目的之一,即不必为每一行创建新视图。您可能希望找到众多 ListView 教程之一来帮助您正确执行此操作。
我查看了 Whosebug,有人问我要不要更改图像,但没有一个解决方案对我有帮助。
我在列表视图的 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;
}
我认为在更新其图像资源后使视图无效将主要解决您的问题。试试你的 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();
}
您的视图似乎都被定义为封闭 class 的成员。这意味着每当调用 getView 时,它们都会不断地重新分配给不同的视图。
相反,您应该在本地将您的视图分配给该方法,并使它们最终化,以便它们可以在您的点击处理程序中被引用:
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
也犯了同样的错误。您需要确保您使用的是与该行相关联的模型,而不是恰好留在 class 成员中的任何模型。
另外,您应该注意您实际上并没有回收这些行。您每次都在创建一个新行。这违背了 ListView 的主要目的之一,即不必为每一行创建新视图。您可能希望找到众多 ListView 教程之一来帮助您正确执行此操作。