ViewHolder如何区分带标签的按钮并在内部方法onClick中使用?

时间:2013-11-25 01:50:13

标签: android android-view

我的ViewAdapterViewHolder,显示:

-------------------------------------

[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;
}

}

2 个答案:

答案 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!");
        }

    }
});