दिलचस्प पोस्ट
दो जेवीएम के बीच साझा मेमोरी सी ++ वैलेरेरे बनाम वेक्टर PHP में अज्ञात संशोधक '/' त्रुटि Visual Basic 6.0 और VBA के बीच अंतर C # का उपयोग कर छवि को कैसे क्रॉप करना है? क्लाइंट पीसी पर लोकलडीबी परिनियोजन सी # या .NET में सबसे खराब वाला क्या है? क्या "आवृत्ति चर" और उद्देश्य- c में "संपत्ति" के बीच अंतर है? क्या स्तंभ क्रमिक स्थिति का उपयोग करके एसक्यूएल सर्वर डेटा का चयन करना संभव है क्या मैं हेडोकू पर एक नोड.जेएस ऐप बनाते समय जीआईटी में नोड_मॉड्यूल में जांच करूँ? Multithreaded NamePipeServer सी # में आईएसओ स्विफ्ट का इस्तेमाल करते हुए NSURL कनेक्शन मैं नैन्ट / चींटी नामकरण पैटर्न का उपयोग कैसे करूं? जावास्क्रिप्ट के साथ एचएच-एमएम-एसएसएस के लिए सेकंड कन्वर्ट? jsoup पोस्टिंग और कुकी

टुकड़ा और एडाप्टर के बीच अंतरफलक कैसे बनाऊँ?

मेरे ListView साथ टुकड़ा है, MyListFragment , और कस्टम CursorAdapter MyListFragment कहते हैं। मैं सूची में पंक्ति के बटन के लिए इस एडाप्टर में onClickListener सेटिंग कर रहा हूँ

 public class MyListAdapter extends CursorAdapter { public interface AdapterInterface { public void buttonPressed(); } ... @Override public void bindView(final View view, final Context context, final Cursor cursor) { ViewHolder holder = (ViewHolder) view.getTag(); ... holder.button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // some action // need to notify MyListFragment } }); } } public MyListFragment extends Fragment implements AdapterInterface { @Override public void buttonPressed() { // some action } } 

बटन को दबाए जाने पर मुझे टुकड़ा को सूचित करना होगा। इस इंटरफ़ेस को कैसे खोलें?

कृपया मदद करें।

वेब के समाधान से एकत्रित समाधान "टुकड़ा और एडाप्टर के बीच अंतरफलक कैसे बनाऊँ?"

एक नया निर्माता और एक उदाहरण चर बनाओ:

 AdapterInterface buttonListener; public MyListAdapter (Context context, Cursor c, int flags, AdapterInterface buttonListener) { super(context,c,flags); this.buttonListener = buttonListener; } 

जब अडैप्टर बनाया जाता है, तो उदाहरण चर को पकड़ने के लिए उचित संदर्भ दिया जाएगा।

क्लिक से टुकड़े को कॉल करने के लिए:

 public void onClick(View v) { buttonListener.buttonPressed(); } 

Adapter बनाने पर, आपको अपने टुकड़े को एडाप्टर के पास भेजना होगा। उदाहरण के लिए

 MyListAdapter adapter = new MyListAdapter (getActivity(), myCursor, myFlags, this); 

क्योंकि this आपके टुकड़े को संदर्भित करेगा, जो अब एक AdapterInterface

ध्यान रखें कि टुकड़े के उन्मुखीकरण में परिवर्तन, यह सबसे अधिक संभावना recreated होगा। यदि आपके एडाप्टर का पुन: निर्माण नहीं किया गया है, तो यह संभावित रूप से एक नयी वस्तु के संदर्भ को रख सकता है, जिसके कारण त्रुटियाँ हो सकती हैं।

Eventbus का उपयोग करना:

उदाहरण:

https://github.com/kaushikgopal/RxJava-Android-Samples/tree/master/app/src/main/java/com/morihacky/android/rxjava/rxbus

या

https://github.com/greenrobot/EventBus

इंटरफेस का उपयोग करना:

मैं वर्तमान उत्तर को समझता हूं लेकिन एक अधिक स्पष्ट उदाहरण की आवश्यकता है। यहां एक उदाहरण है जिसका मैंने एक Adapter (रीसाइक्लाइव्यूएपैटर) और एक Fragment साथ प्रयोग किया था।

Callback इंटरफेस बनाएं:

 public interface AdapterCallback { void onMethodCallback(); } 

Callback / Fragment में पासिंग:

यह वह interface लागू करेगा जो हमारे Adapter । इस उदाहरण में, जब उपयोगकर्ता RecyclerView में आइटम पर क्लिक करता है, तो उसे बुलाया जाएगा।

आपके Fragment :

 public class MyFragment extends Fragment implements AdapterCallback { private MyAdapter mMyAdapter; @Override public void onMethodCallback() { // do something } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.mMyAdapter = new MyAdapter(this); // this class implements callback } } 

अपने एडाप्टर में Callback उपयोग करें:

Fragment , हमने अपना Adapter शुरू किया और इसे कंस्ट्रक्टर के लिए तर्क के रूप में दिया। यह हमारे कॉलबैक विधि के लिए हमारे interface आरंभ करेगा। आप देख सकते हैं कि हम उपयोगकर्ता क्लिक के लिए हमारी कॉलबैक विधि का उपयोग करते हैं।

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private AdapterCallback mAdapterCallback; public MyAdapter(AdapterCallback callback) { this.mAdapterCallback = callback; } @Override public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) { // simple example, call interface here // not complete viewHolder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mAdapterCallback.onMethodCallback(); } }); } } 

या अपने एडाप्टर में Fragment उपयोग करें:

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private AdapterCallback mAdapterCallback; public MyAdapter(Fragment fragment) { try { this.mAdapterCallback = ((AdapterCallback) fragment); } catch (ClassCastException e) { throw new ClassCastException("Fragment must implement AdapterCallback."); } } @Override public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) { // simple example, call interface here // not complete viewHolder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { mAdapterCallback.onMethodCallback(); } catch (ClassCastException exception) { // do something } } }); } } 

Fragment (or Activity) में Adapter से कॉलबैक प्राप्त करने के लिए नीचे दिए गए 2 चरणों का पालन करें

सबसे पहले: आपके Adapter

 public class ListAdapter extends RecyclerView.Adapter < RecyclerListAdapter.ItemViewHolder > { ... private ListAdapterListener mListener; public interface ListAdapterListener { // create an interface void onClickAtOKButton(int position); // create callback function } public RecyclerListAdapter(Context mContext, ArrayList < Items > listItems, ListAdapterListener mListener) { // add the interface to your adapter constructor ... this.mListener = mListener; // receive mListener from Fragment (or Activity) } ... public void onBindViewHolder(final ItemViewHolder holder, final int position) { holder.btnOK.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // use callback function in the place you want mListener.onClickAtOKButton(position); } }); ... } ... } 

दूसरा: आपके Fragment (or Activity) , कॉलबैक विधि को लागू करने के लिए 2 तरीके हैं

रास्ता 1

  public MyListFragment extends Fragment { ... public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { ... ListAdapter adapter = new ListAdapter(getActivity(), listItems, new ListAdapter.ListAdapterListener() { @Override public void onClickAtOKButton(int position) { Toast.makeText(getActivity(), "click ok button at" + position, Toast.LENGTH_SHORT).show(); } }); ... } } 

रास्ता 2

 public MyListFragment extends Fragment implements ListAdapter.ListAdapterListener { ... public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { ListAdapter adapter = new ListAdapter (getActivity(), listItems, this); ... } @Override public void onClickAtOKButton(int position) { Toast.makeText(getActivity(), "click ok button at" + position, Toast.LENGTH_SHORT).show(); } } 

यह एक गतिविधि और एक टुकड़ा जिस तरह से संवाद करना चाहिए के समान है। अपने एडाप्टर के निर्माता में, अपने टुकड़े के संदर्भ को पास करें, इसे अपने इंटरफेस में डालें और अपने ऑनक्लिक मेथड पर रीरेफरेंस.बटनॉनड () को कॉल करें।