我有一个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;
}
}
不要在点击按钮中进行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
才能工作。很明显,这不是很简单,但它应该让你知道你能做什么
另外:请确保将您的文本大小、字符串等移到资源文件中。像现在这样指定文本大小是一种糟糕的做法——当高DPI设备上的文本大小12明显小于低DPI设备时会发生什么?或者你想提供英语以外的语言?好好阅读参考资料文档。
与其从holder中获取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!");
}
}
});