我的ViewAdapter
有ViewHolder
,显示:
-------------------------------------
[image] [text 1].............. [Buy!]
- >购买按钮更改颜色/字体大小/文本名称
-------------------------------------
[image] [text 2].............. [Buy!]
- >购买按钮更改颜色/字体大小/文本名称
-------------------------------------
然而,除了更改颜色/字体大小/文本名称之外,按钮具有不同的功能(尚未实现),我不知道如何区分按钮。此外,由于onClick
是一个内部类,holder
必须是最终的,它不能是因为它被使用了很多次。有没有办法只将它改为第一个购买按钮为灰色并“购买!”点击时和第二个购买按钮相同?
public class StoreListViewAdapter extends ArrayAdapter<StoreRowItem> {
Context storeContext;
String android_id = Secure.getString(storeContext.getContentResolver(),
Secure.ANDROID_ID);
public StoreListViewAdapter(Context context, int resourceId,
List<StoreRowItem> items) {
super(context, resourceId, items);
this.storeContext = context;
}
/*private view holder class*/
private class ViewHolder {
ImageView imageView;
TextView txtTitle;
Button buttonView;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
StoreRowItem storeRowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) storeContext
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.store_list_row, null);
holder = new ViewHolder();
holder.txtTitle = (TextView) convertView.findViewById(R.id.store_title);
holder.imageView = (ImageView) convertView.findViewById(R.id.store_list_image);
holder.buttonView = (Button) convertView.findViewById(R.id.buy_button);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.buttonView.setText(storeRowItem.getBuy());
holder.txtTitle.setText(storeRowItem.getTitle());
holder.imageView.setImageResource(storeRowItem.getImageId());
holder.buttonView.setTag(storeRowItem.getListNum());
holder.buttonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String title = v.getTag().toString();
if (title.equals("1")) {
holder.buttonView.setTextSize(12);
holder.buttonView.setBackgroundColor(Color.GRAY);
holder.buttonView.setText("Purchased!");
}
else if (title.equals("2")) {
holder.buttonView.setTextSize(12);
holder.buttonView.setBackgroundColor(Color.GRAY);
holder.buttonView.setText("Purchased!");
}
}
});
return convertView;
}
}
答案 0 :(得分:3)
不要在按钮单击中执行UI工作,而是更新所需的任何购买状态,然后调用notifyDataSetChanged
。这样,您的getView
方法将再次为该行调用,您可以根据修改后的状态更新视图。
例如:
if (storeRowItem.isPurchased()) {
holder.buttonView.setTextSize(12);
holder.buttonView.setBackgroundColor(Color.GRAY);
holder.buttonView.setText("Purchased!");
} else {
// Make sure to set your view state back to the non-purchased defaults, because of view recycling
holder.buttonView.setTextSize(14);
holder.buttonView.setBackgroundColor(Color.White);
holder.buttonView.setText(storeRowItem.getBuy());
}
holder.buttonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getItem(position).setPurchased(true);
notifyDataSetChanged();
}
});
您必须将position
参数标记为final
才能使其生效。显然这并不是很容易接受,但它应该让你知道你能做些什么。
另外:确保将文本大小,字符串等移动到资源文件中。像你正在做的那样指定文本大小是不好的做法 - 当文本大小12在高DPI设备上明显小于低DPI设备时会发生什么?或者您想提供英语以外的语言?好好阅读Resources documentation。
答案 1 :(得分:0)
不是从持有者获取buttonView,而是从传递给onClick方法的视图中获取它。
holder.buttonView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final ButtonView buttonView = (ButtonView) v;
String title = v.getTag().toString();
if (title.equals("1")) {
buttonView.setTextSize(12);
buttonView.setBackgroundColor(Color.GRAY);
buttonView.setText("Purchased!");
}
else if (title.equals("2")) {
buttonView.setTextSize(12);
buttonView.setBackgroundColor(Color.GRAY);
buttonView.setText("Purchased!");
}
}
});