ViewHolder如何区分带有标记的按钮和内部方法onClick中使用的按钮



我有一个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!");
        }
    }
});

最新更新