2017-10-09 24 views
-2

私は、Bluetoothのデバイスをrecyclerviewで表示するはずのアプリケーションを作成しています。ユーザーがアイテムをクリックしてアクションを実行できるようにしたいと考えています。今のところ私はちょうどクリックでトーストを表示しようとしていますが、後で私はおそらく、ペアを選択するダイアログを表示したいと思います。しかし、私はonclicklistenerの私の使い方にapperentlyなことがありません。私はViewHolderクラスを持っています:DeviceHolderView.OnClickListenerを実装し、Toast.makeText()の呼び出しをonClickオーバーライド内に配置しています。しかし、何も起こっていません。私はちょうどマイナーなものを逃していると確信して、問題を見つけるのを助けることに感謝します。また、私はkotlinでこれをやっています。これは新しいものです。これを行うためのより効率的なコットリーンタイプの方法があれば、それも助けになるでしょう。私は下に私のコードを掲載しています。前もって感謝します。私のリサイクラビューでカスタムViewHolderのOnClickListenerを実装する方法は?

class DeviceAdapter(val mContext : Context) : RecyclerView.Adapter<DeviceAdapter.DeviceHolder>(){ 

val mDevices = ArrayList<BluetoothDevice>() 

interface OnClickListener{ 
    fun onClick(v: View) 
} 

fun updateItems(list: ArrayList<BluetoothDevice>){ 
    mDevices.clear() 
    mDevices.addAll(list) 
    Log.d(TAG, "updating items : $mDevices") 
    notifyDataSetChanged() 
} 

fun ViewGroup.inflate(@LayoutRes res: Int, attachToRoot: Boolean = false): View{ 
    return LayoutInflater.from(mContext).inflate(res, this, attachToRoot) 
} 

override fun onBindViewHolder(holder: DeviceHolder, position: Int) { 
    Log.d(TAG, "onBindViewHolder called!") 
    holder.bindItems(mDevices.get(position)) 
} 

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): DeviceAdapter.DeviceHolder{ 
    Log.d(TAG, "onCreateViewHolder called!") 
    val v = parent!!.inflate(R.layout.device_item, false) 
    return DeviceHolder(v) 
} 

override fun getItemCount(): Int { 
    return mDevices.size 
} 

inner class DeviceHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { 

    override fun onClick(v: View?) { 
     Toast.makeText(mContext, "test", Toast.LENGTH_LONG).show() 
    } 

    val nameView = itemView.findViewById(R.id.nameView) as TextView 
    val addrView = itemView.findViewById(R.id.addressView) as TextView 

    fun bindItems(btDevice: BluetoothDevice) { 
     Log.d(TAG, "holder created!") 
     nameView.text = btDevice.name 
     addrView.text = btDevice.address 
     itemView.setOnClickListener { this } 
    } 

} 

companion object { 
    val TAG = "Device Adapter" 
} 
} 

は、ここでは、ログメッセージです:

10-09 00:35:50.233 7581-7581/com.example.zemcd.toofxchange D/DiscoveryTask: device found! 
10-09 00:35:51.795 7581-7581/com.example.zemcd.toofxchange D/DiscoveryTask: device found! 
10-09 00:35:56.752 7581-7581/com.example.zemcd.toofxchange D/DiscoveryTask: device list : [**:B8:9A:39:1D:**, **:DF:BF:2A:F3:**] 
10-09 00:35:56.752 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: updating items : [**:B8:9A:39:1D:**, **:DF:BF:2A:F3:**] 
10-09 00:35:56.752 7581-7581/com.example.zemcd.toofxchange D/DiscoveryTask: discovery finished 
10-09 00:35:56.762 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: onCreateViewHolder called! 
10-09 00:35:56.774 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: onBindViewHolder called! 
10-09 00:35:56.774 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: holder created! 
10-09 00:35:56.783 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: onCreateViewHolder called! 
10-09 00:35:56.786 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: onBindViewHolder called! 
10-09 00:35:56.786 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: holder created! 
+0

ログには何が表示されますか?あなたはこれらの素晴らしいログステートメントをすべて持っているからです。 – Vucko

+0

@Vucko私は自分のログメッセージを含む編集を投稿しました。 –

+0

アイテムビューはクリック可能ですか? xmlを確認してください。これはすべて正当だと思われる。 – Vucko

答えて

1

私は得ることができましたこれは、OnClickListenerの実装を削除し、代わりにitemView.setOnClickListener { /* lamda here */ }というこのステートメントを使用することで修正されました。私はこの正確な構文がjavaではなくkotlinで利用可能であるとは思わない。

inner class DeviceHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { 

    val nameView = itemView.findViewById(R.id.nameView) as TextView 
    val addrView = itemView.findViewById(R.id.addressView) as TextView 

    fun bindItems(btDevice: BluetoothDevice) { 
     Log.d(TAG, "holder created!") 
     nameView.text = btDevice.name 
     addrView.text = btDevice.address 
     itemView.setOnClickListener { Toast.makeText(it.context, "testing", Toast.LENGTH_SHORT).show() } 
    } 

} 

iはitemViewオブジェクトのコンテキストにアクセスラムダの内部itキーワードを使用して、代わりに私の元mContextは、上述した使用して:ここで私の改訂コードです。私は、私の古いアプローチがうまくいかなかった理由はまだ分かっていませんが、これは私にとってはうまくいきました。

0

あなたはclicklistnerを実装しているが、nameViewAddrViewためclickListenerをlistener.addクリックして任意のレジスタを追加していないあなたのコードによります。

nameView.setOnClickListener(this); 
addrView.setOnClickListener(this); 
0

これは動作します:

1は、アダプタに独自のクリックのリスナーを設定し、それへの参照を保持:

private OnItemClickListener onItemClickListener; 
// ... 
public interface OnItemClickListener { 
    // note: here you would need some params, for instance the view 
    void onItemClick(View v); 
} 

public void setOnItemClickListener(OnItemClickListener l) { 
    this.onItemClickListener = l; 
} 

2各viewholderが作成されたとき、それにリスナーを設定します一度コールバックされると、1に設定されたリスナーにコールバックを渡します。

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    ViewHolder vh = getViewHolder(/*...*/); 
    vh.setOnItemClickListener(new OnItemClickListener() {     
     if (onItemClickListener != null) { 
      // each view holder calls the one listener set to the Adapter 
      onItemClickListener.onItemClick(v); 
     } 
    } 
} 

3視聴者をli (ニコラウス)ビューのonClickにSTEN、そしてそれは、コール転送してみましょう:この時点で

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
// each view holder has a listener set to it 
private OnItemClickListener mListener; 

public ViewHolder(View v) {   
    super(v); 
    // ... 
    // set the viewholder as a listener to the view's clicks 
    v.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    // when view is clicked, simply forward the call 
    if (mListener != null) { 
     mListener.onItemClick(v); 
    } 
} 

public void setOnItemClickListener(OnItemClickListener listener) { 
    mListener = listener; 
} 

}

4は、アダプターのユーザーが持っています:

mAdapter = new MyAdapter(ctx); 
mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { 
    @Override 
    public void onItemClick(View v) { 
     // the given view was clicked, do something with it 
    } 
});