web-dev-qa-db-ja.com

アダプター内でバターナイフを使用する方法

ButterKnifeを使用して、listViewアダプター内のビューをバインドしたいと思います。

私はこれを試しましたが、「スピナー」変数を単純に使用することはできません。

public class WarmSpinnerAdapter extends ArrayAdapter<Warm> {

    Context context;

    public WarmSpinnerAdapter(Context context, int resource, Warm[] objects) {
        super(context, resource, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = LayoutInflater.from(context).inflate(R.layout.item_spinner, null);


        return v;
    }

    @OnClick(R.id.spinner)
    public void onClick() {
        //open dialog and select
    }

    static class ViewHolder {

        @BindView(R.id.spinner)
        MyTextView spinner;

        ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }
}

何かアイデアはありますか?

13
Stepan

最初にバインドするには、ビューをButterKnifeに渡す必要があります。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = LayoutInflater.from(context).inflate(R.layout.item_spinner, null);
    ButterKnife.bind(this,v);

    return v;
}

次に、ビューにアクセスします。

15
omerkaraca

ButterKnifeはビューをViewHolderクラスにバインドしているため、WarmSpinnerAdapterはビューに直接アクセスできません。代わりに、この部分をViewHolderクラス内に移動する必要があります。

@OnClick(R.id.spinner)
public void onClick() {
    //open dialog and select
}

そこから、アダプターから内部メソッドを呼び出すか、ViewHolder内で直接ロジックを実行できます。

3
EricDS

ArrayAdapterを使用しているので、getView()メソッドに適切なViewHolderロジックが必要です。 (onClickアノテーションもViewHolderクラス内に配置する必要があるため、正しく設定されていません。)

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.item_spinner, null);
        viewHolder = new ViewHolder(convertView);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    // now you can access your spinner var.
    MyTextView spinner = viewHolder.spinner;

    return convertView;
}
1
crymson