2016-02-16 6 views
18

मैं स्थिति के आधार पर बच्चे को देखने की कोशिश कर रहा हूं। मैं दृश्य मिल सकता है जब एक आइटम क्लिक किया जाता है: -रीसाइक्लर व्यू से बाल दृश्य कैसे प्राप्त करें?

rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      ((MainActivity) getActivity()).showSellRecordFragment(position, view); 
     } 
    })); 

अब मैं बच्चे को देखने नहीं मिल सकता है, क्लिक के बिना के उदाहरण के लिए स्थिति से मान लीजिए:

rvSellRecords.someMagicalMethodWhichReturnsViewByPosition(5); 

प्रश्न: कैसे से बच्चे दृश्य दिखाने के लिए RecyclerView? इनाम लिए

संपादित करें:

enter image description here

मैं उत्पादों सूची दिखाने के लिए RecyclerView है। जब मैं उस पर क्लिक करता हूं, तो मैं नई फ्रैगमेंट जोड़ रहा हूं जहां मैं उत्पाद जानकारी दिखाता हूं। मैं RecyclerView से दृश्य के साथ उपकरण पट्टी को अद्यतन करने कर रहा हूँ जबकि उद्घाटन - यह पूरी तरह से काम कर रहा है:

rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() { 
        @Override 
        public void onItemClick(View view, int position) { 
         sellPresenter.onSellRecordSelected(position, view); 
        } 
       })); 

    When I click blue button with "+", I am incrementing quantity by 1. 





    public void onIncrementButtonClicked(){ 
       sellRecord.setCount(sellRecord.getCount() + 1); 
       showQuantity(); 
       bus.post(new SellRecordChangedEvent(sellRecord, sellRecordPosition)); 
       } 

Then I am posting updated sellRecord to first fragment using EventBus. There I am updating list data. I supposed that updating value(sell) automatically updates adapter. Now I am getting view from adapter using custom method(getView) which was created by me(you can find it below). 



@Subscribe 
public void onEvent(SellRecordChangedEvent event){ 
    sell.getSellRecords().set(event.getSellRecordPosition(), event.getSellRecord()); 
    sell.recalculate(); 
    int position = event.getSellRecordPosition(); 
    View view = adapter.getView(position); 
    bus.post(new TransactionTitleChangedEvent(null, view)); 
} 

This is my adapter class - I changed adapter little bit to collect view in list and added method which returns view for respective position: 



public class SellRecordsAdapter extends RecyclerView.Adapter<SellRecordsAdapter.ViewHolder> { 

    ..... 
    ..... 
    ..... 
    List<View> viewList; 

    public SellRecordsAdapter(List<SellRecord> sellRecordList) { 

     ..... 

     viewList = new ArrayList<>(); 
    } 

    ..... 
    ..... 
    ..... 

    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, int i) { 

     ..... 
     ..... 
     ..... 

     viewList.add(i, viewHolder.itemView); 

    } 


    public View getView(int position){ 
     return viewList.get(position); 
    } 

} 

मेरे समस्या: जब मैं टूलबार में दृश्य को अद्यतन करने, मैं पुराने दृश्य हो रही है। जब मात्रा 3 होती है, तो मुझे 2 के साथ दृश्य मिल रहा है। जब मात्रा 10 - व्यू 9 के साथ है।

मेरा प्रश्न: आइटम की स्थिति (क्लिक श्रोता के बिना) का उपयोग कर रीसाइक्लिंग व्यू से कैसे देखें?

enter image description here

+0

से ऊपर दिखाया गया है कि आप मुझे क्यों कम कर रहे हैं? –

+0

यू क्लिक किए बिना बच्चे का दृश्य प्राप्त करना चाहते हैं ?? – Manishika

+0

हां, मैं बिना क्लिक किए दृश्य देखना चाहता हूं - स्थिति –

उत्तर

0

लिखें अनुकूलक में इस विधि।

public Object getItem(int position) { 
     return yourArrayList.get(position); 
    } 

और तुम सिर्फ इसे पसंद

yourAdapter.getItem(2); 

कॉल करने के लिए अपने आवश्यक स्थिति पारित की जरूरत है। आशा है कि यह आपकी समस्या हल करे।

2

आप इसके लिए रीसाइक्लर व्यू लेआउट मैनेजर का उपयोग कर सकते हैं।

View view = layoutManager.findViewByPosition(position) 
+0

आपके उत्तर के लिए धन्यवाद, दुर्भाग्यवश यह विधि शून्य –

+0

लौट रही है क्या आप वाकई एक ही लेआउटमैनेजर का उपयोग कर रहे हैं जिसे आपने अपने रीसाइक्लिंग व्यू में प्रदान किया है? –

+0

हां, मुझे यकीन है क्योंकि मैंने अलग-अलग स्थानों में दो बार कोशिश की है। उदाहरण के लिए: rvSellRecords.addOnItemTouchListener (नई RecyclerItemClickListener (getActivity(), नई RecyclerItemClickListener.OnItemClickListener() { @Override सार्वजनिक शून्य onItemClick (दृश्य देखें, पूर्णांक स्थिति) { देखें view2 = layoutManager.findViewByPosition (स्थिति); ((मुख्य गतिविधि) getActivity())। ShowSellRecordFragment (स्थिति, दृश्य 2); } }); –

0

सिर्फ अपने कोड में इस पद्धति रख दिया और के रूप में तुम्हें पसंद करता है

void someMagicalMethodWhichReturnsViewByPosition(int position){ 
     //I assumes child views are CardView 
     CardView c = (CardView)rvSellRecords.getItem(int position); 
     ///optional codes 
     ////////// 
    } 
0

अब मैं आपकी समस्या को समझते हैं कि आप यह कह सकते हैं। आपको recyclerview आइटम और गतिविधि में शामिल होने के लिए इंटरफ़ेस का उपयोग करने की आवश्यकता है। आप नीचे दिए गए की तरह एक अंतरफलक वर्ग को परिभाषित करना होगा:

public interface IViewClick { 
    public void onClickButtonAdd(); 
} 

अपने एडाप्टर वर्ग को यह पैरामीटर जोड़ें:

private IViewClick mListener; 

और मूल्य है कि आदानों से प्राप्त के साथ निर्माता में यह आरंभ कर देगा। जब प्लस बटन पर उपयोगकर्ता क्लिक करें, आप ईवेंट गतिविधि को यह लाइन द्वारा भेजें:

mListener.onClickButtonAdd(); 
अपनी गतिविधि कक्षा में

आप IViewClick इंटरफ़ेस लागू करता है और इस तरह वहाँ अपने कोड जोड़ने के लिए, करना होगा:

@Override 
    public void onClickButtonAdd() { 
     /// TODO every thing that you want. 
     /// change your toolbar values. 
    } 
यह

आपके लिए अच्छा समाधान नहीं है।

रीसाइक्लर व्यू। व्यूहोल्डर धारक = mRecyclerView.findViewHolderForItemId (mAdapter.getItemId (i));

+0

सुझाव के लिए धन्यवाद, लेकिन यह समस्या अभी भी शेष है: जब मैं टूलबार में दृश्य अपडेट करता हूं, तो मुझे पुराना दृश्य मिल रहा है। जब मात्रा 3 होती है, तो मुझे 2 के साथ दृश्य मिल रहा है। जब मात्रा 10 - व्यू 9 के साथ है। –

12

पद के लिए दर्शक धारक प्राप्त करने के लिए recyclerView.findViewHolderforLayoutPosition(position) या reyclerView.findViewHolderforAdaperPosition(position) का उपयोग करें। फिर आप अपने दर्शक से किसी भी बच्चे तक पहुंच सकते हैं।

चेकआउट Recyclerview

+0

इससे मेरी मदद मिली। धन्यवाद :) – KratosBala

0

मैं ट्रैकिंग दृश्य सूची अपने आप की सिफारिश नहीं होगा। इससे आइटम अपडेट, स्थिति अपडेट इत्यादि के साथ अजीब समस्याएं हो सकती हैं।

इसके बजाय अपने SellRecordChangedEvent पर, adapter.getView() के बजाय findViewHolderForAdapterPosition() का उपयोग करें।

@Subscribe 
public void onEvent(SellRecordChangedEvent event){ 
    sell.getSellRecords().set(event.getSellRecordPosition(), event.getSellRecord()); 
    sell.recalculate(); 
    int position = event.getSellRecordPosition(); 
    View view = yourrecyclerview.findViewHolderForAdapterPosition(position); 
    bus.post(new TransactionTitleChangedEvent(null, view)); 
} 

http://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition(int)

और एक तरफ ध्यान दें के रूप में, यह स्पर्श श्रोता उपयोग करने के बजाय ViewHolder पर itemView को एक वास्तविक आइटम क्लिक श्रोता को लागू करना बेहतर है। इस ऑनलाइन के कई उदाहरण हैं।

0

तो पुनर्नवीनीकरण और आपकी उत्पाद जानकारी 2 अलग-अलग टुकड़ों में हैं? आप पुनर्चक्रण के विचारों को अपडेट करने की उम्मीद कर रहे हैं जब वे अग्रभूमि में भी नहीं हैं? आप event.getSellRecordPosition() पर एडेप्टर डेटा आइटम का डेटा बदल रहे हैं, लेकिन आप एडाप्टर को सूचित नहीं कर रहे हैं कि इसका डेटासेट बदल गया है, या तो adapter.notifyDataSetChanged() या अन्य notifyItemChanged(position) विधियों द्वारा।

मैं बहुत की तरह अपने onEvent() को संशोधित चाहते हैं:

@Subscribe 
public void onEvent(SellRecordChangedEvent event){ 
    sell.getSellRecords().set(event.getSellRecordPosition(), event.getSellRecord()); 
    sell.recalculate(); 
    int position = event.getSellRecordPosition(); 
    MyViewHolder holder = adapter.onCreateViewHolder(yourRecyclerView, 0); 
    adapter.onBindViewHolder(holder,position); 
    View view = adapter.getView(position); 
    bus.post(new TransactionTitleChangedEvent(null, view)); 
} 

createViewHolder और अपने एडाप्टर पर अगले BindViewHolder पर कॉलिंग निश्चित रूप से उस स्थिति के लिए विचारों अपडेट करेगा, तो अपने adapter.getView (स्थिति) लौटना चाहिए आप नवीनतम दृश्य।

यहाँ MyViewHolder अपने viewholder वर्ग और yourRecyclerview है, मैं एक जवाब जिसकी वजह से() RecyclerView से वास्तव में findviews लिए जटिल है पोस्ट अपने recycler दृश्य

2

के संदर्भ में है।

@ जो: 4 घंटे खर्च करने के बाद एक जवाब मिला। जो मुझे सूचकांक का उचित दृश्य देता है। v.findViewById(R.id.edittext) या किसी आईडी:

mAdapter is adapter of RecyclerView   
View v = recyclerView.findViewHolderForItemId(mAdapter.getItemId(index/position)).itemView; 

अब बस द्वारा अपने विचारों का उपयोग।

0
RecyclerView.ViewHolder holder = recycleView.findViewHolderForAdapterPosition(position); 
ImageView imageView = holder.itemView.findViewById(R.id.iv_product); 

यह @ रवि तेजा के उत्तर का पूरक है। आप रीसाइक्लर से होल्डर को विशेष आइटम की स्थिति का उपयोग करके देख सकते हैं, फिर दृश्य से एक विशेष दृश्य प्राप्त करें जैसा कि

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