【问题标题】:Change Image of image button in list view在列表视图中更改图像按钮的图像
【发布时间】:2016-03-15 18:55:21
【问题描述】:

我在 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;

}

【问题讨论】:

  • getView 每次系统需要重绘项目时都会被调用,因此您必须将项目的状态保存在某个持有者或哈希图中,调用 adapter.notifyDataSetChanged() 并向您的 getView 方法添加逻辑,例如 if (item[i].isClicked) imageButton.setImage(...) else imageButton.setItem(another_one);
  • 感谢 Slavik 的建议,但这也无济于事。而且我没有单击该行,而是单击该行的按钮。

标签: android listview android-studio imagebutton baseadapter


【解决方案1】:

您的视图似乎都被定义为封闭类的成员。这意味着每当调用 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 也犯了同样的错误。您需要确保您使用的是与该行关联的模型,而不是恰好留在类成员中的任何模型。

另外,您应该注意,您实际上并没有回收这些行。您每次都在创建一个新行。这违背了 ListView 的主要目的之一,即不必为每一行创建新视图。您可能希望找到众多 ListView 教程之一来帮助您正确执行此操作。

【讨论】:

  • 感谢 Doug 解决了这个问题。当然,我会学习更多更好的教程。
【解决方案2】:

我认为在您更新其图像资源后,它主要会解决您使视图无效的问题。试试你的 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();

    }

【讨论】:

  • 嗨,马特,这没有成功。缺少其他我无法追踪的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2011-06-25
相关资源
最近更新 更多