2017-05-26 4 views
13

के साथ दृश्य को कैसे बाध्य करें मुझे परेशान करता है कि Recycleler.ViewHolder में दृश्य को कैसे बाध्य करना है। यह मेरा सरल एडाप्टर है और इसे के बिना kotlin-android-extensions पर कोटलिन का उपयोग कैसे करें?RecyclerView.ViewHolder में कोंडलिन

public class RoomAdapter extends RecyclerView.Adapter<ViewHolder> { 

    private OnItemClickListener mListener; 
    private List<LocationBean> mRooms; 

    static class ViewHolder extends RecyclerView.ViewHolder { 

    @BindView(R.id.tv_title) 
    TextView tvTitle; 

    public ViewHolder(View itemView) { 
    super(itemView); 
    ButterKnife.bind(this, itemView); 
    } 
    } 

    public void setData(List<LocationBean> rooms) { 
    mRooms = rooms; 
    notifyDataSetChanged(); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()) 
     .inflate(R.layout.item_first_select, parent, false); 
    return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
    holder.tvTitle.setText(mRooms.get(position).getLocation()); 

    holder.itemView.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     mListener.onItemClickListener(v, holder.getLayoutPosition()); 
    } 
    }); 
    } 

    @Override 
    public int getItemCount() { 
    return mRooms == null ? 0 : mRooms.size(); 
    } 

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

    public interface OnItemClickListener { 
    void onItemClickListener(View v, int pos); 
    } 

} 
+0

[एडाप्टर या व्यूहोल्डर में कोटलिन सिंथेटिक] का संभावित डुप्लिकेट (https://stackoverflow.com/questions/33304570/kotlin- सिंथेटिक-in-adapter-or-viewholder) –

+1

आपको वास्तव में बंदरगाह और शो करने की कोशिश करनी चाहिए ऐसा करने में आपके पास विशिष्ट समस्याएं थीं। अन्यथा आप "मेरे लिए मेरे कोड को पोर्ट करें" की सेवा मांग रहे हैं –

उत्तर

28

posted solution काम करता है, लेकिन मैं इसमें कुछ जोड़ना चाहता हूं। व्यूहोल्डर पैटर्न का उद्देश्य केवल findViewById कॉल को प्रत्येक दृश्य के लिए कॉल करना है, और उसके बाद उन संदर्भों को ViewHolder के अंदर रखें, और जब भी आपको बाध्य करने की आवश्यकता हो, वहां से दृश्यों तक पहुंचें।

हालांकि, onBindViewHolder विधि में holder.itemView.tv_title.text बुला एक findViewById कॉल कारण ViewitemView भीतर हर बार viewholder बाध्य है आईडी tv_title है कि खोजने के लिए होगा। यह मूल रूप से प्रदर्शन लाभ और कैशिंग विचार को समाप्त करता है जो दर्शकों के लिए हैं।

आप अपने ViewHolder किसी प्रॉपर्टी को जोड़ने, और एक कॉल एक्सटेंशन के साथ बनाया के साथ आरंभ, तो तरह से viewholder पैटर्न और Kotlin एंड्रॉयड एक्सटेंशन एक ही समय में का उपयोग कर सकते हैं:

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { 
    val title = itemView.tv_title 
} 

तो फिर तुम इस संपत्ति के माध्यम से View पहुँच सकते हैं:

override fun onBindViewHolder(holder: ViewHolder, position: Int) { 
    holder.title.text = mRooms!!.get(position).getLocation() 

    holder.itemView.setOnClickListener { v -> 
     mListener?.onItemClickListener(v, holder.layoutPosition) 
    } 
} 

अन्त में, मैं सुझाव है किसे छुटकारा चाहते हैंऑपरेटर, और बदले एक अशक्त जाँच प्रदर्शन:

mRooms?.let { rooms -> 
    holder.title.text = rooms[position].getLocation() 
} 
5

बस सुनिश्चित करें कि आप अपने आवेदन Gradle फ़ाइल (न कि आपके जड़ Gradle) में apply plugin: 'kotlin-android-extensions' है और फिर बस Kotlin फ़ाइल शॉर्टकट को Convert जावा फ़ाइल का उपयोग कर सकते हैं। बटरनाइफ कोड को हटाएं और itemView.tv_title को ViewHolder ऑब्जेक्ट में सीधे संदर्भ दें।

संपादित: मैं Kotlin का सिंथेटिक दृश्य कैशिंग का लाभ लेने के कोड बदल दिया है, आप उन लाभ हासिल करने के val title = itemView.tv_title की तरह एक दृश्य के लिए एक चर बराबर निर्धारित करने की आवश्यकता नहीं है

import kotlinx.android.synthetic.main.item_first_select.view.* 

class RoomAdapter : RecyclerView.Adapter<RoomAdapter.ViewHolder>() { 

    private var listener: OnItemClickListener? = null 
    private var rooms: List<LocationBean>? = null 

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

     fun bind(room: Room) { 
      itemView.tv_title.text = room.getLocation() 
     } 

    } 

    fun setData(rooms: List<LocationBean>) { 
     this.rooms = rooms 
     notifyDataSetChanged() 
    } 

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 
     val view = LayoutInflater.from(parent.context) 
      .inflate(R.layout.item_first_select, parent, false) 
     return ViewHolder(view) 
    } 

    override fun onBindViewHolder(holder: ViewHolder, position: Int) { 
     rooms?.get(position)?.let { room -> 
      holder.bind(room) 
     } 

     holder.itemView.setOnClickListener { v -> 
      listener?.onItemClickListener(v, holder.layoutPosition) 
     } 
    } 

    override fun getItemCount(): Int { 
     return rooms?.size ?: 0 
    } 

    fun setOnItemClickListener(listener: OnItemClickListener) { 
     this.listener = listener 
    } 

    interface OnItemClickListener { 
     fun onItemClickListener(v: View, pos: Int) 
    } 

} 
0

दूसरों सवाल बहुत अच्छी तरह से उत्तर दिया, मैं तो बस जोड़ने कि class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) में कोई नल ऑपरेटर होना चाहिए ('?') itemView के बाद kotlin काम के लिए बाध्य करने के लिए करना चाहता था ।

एंड्रॉइड स्टूडियो स्वचालित रूप से ViewHolder(itemView) से कन्स्ट्रक्टर पैरामीटर जोड़ने के लिए स्वत: पूर्ण का उपयोग करते समय उस निरर्थक ऑपरेटर को जोड़ता है।

संबंधित मुद्दे