2015-01-23 10 views
6

मेरे पास प्रति पंक्ति 2 कॉलम के साथ, GridLayoutManager के साथ एक RecyclerView है। चूंकि विकास एंड्रॉइड टीवी के लिए है ताकि मुझे नेविगेट करने के लिए फोकस की आवश्यकता हो।अजीब एंड्रॉइड रीसाइक्लर व्यू (ग्रिडलाउट मैनेजर) फोकस व्यवहार

enter image description here

यह अगर मैं किसी भी दिखाई आइटम पर नेविगेट करने कुंजी दबाए उपयोग कर रहा हूँ ठीक है। उदाहरण के लिए, आइटम 1 -> आइटम 3 -> आइटम 5 -> आइटम 7 (केवल आंशिक रूप से दृश्यमान।)। लेकिन जब मैं फिर से कुंजी दबाए दबाते हैं, तो ध्यान केंद्रित मद 10 के बजाय 9 पर आ जाएगा

enter image description here

मेरे ग्रिड दृश्य एडाप्टर है:

public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {  
    private ArrayList<String> mDataset; 

    public GridAdapter(ArrayList<String> myDataset) { 
     mDataset = myDataset; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.grid_item, viewGroup, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.txtTitle.setText(mDataset.get(position));  
    } 

    @Override 
    public int getItemCount() { 
     return mDataset.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView txtTitle; 
     public ViewHolder(View v) { 
      super(v); 
      txtTitle = (TextView) v.findViewById(R.id.title); 
     } 
    } 
} 

किसी भी विचार कैसे इस समस्या को हल करने के लिए? धन्यवाद।

+1

आप इस सुलझाने खत्म किया? यह पिछले महीने या दो के लिए मेरे जीवन को गड़बड़ कर रहा है। – Dreamingwhale

+0

नहीं, मुझे अभी तक कोई समाधान नहीं मिला है। लेकिन यह मेरे आवेदन में बहुत महत्वपूर्ण नहीं है इसलिए मैंने इसे वहां रखा है। उम्मीद है कि कोई व्यक्ति किसी दिन इस मुद्दे को हल कर सकता है। –

+0

नेविगेशन दस्तावेज़ यह कहते हैं "एंड्रॉइड फ्रेमवर्क स्वचालित रूप से आपके लेआउट में फोकस करने योग्य तत्वों की सापेक्ष स्थिति के आधार पर एक दिशात्मक नेविगेशन योजना लागू करता है।" क्या आप किसी भी तरह अपने एडाप्टर में अगली फोकसडाउन, अगली फोकसअप आदि सेट कर सकते हैं? – Elrond

उत्तर

0

मैंने इसका एक हैक जवाब निकाला। यह आपको तब तक स्क्रॉल नहीं करेगा जब तक कि नई पंक्ति फुलाया न जाए (इसलिए यह नई पंक्ति पर बढ़ने की प्रतीक्षा करेगा।) लेकिन यह आमतौर पर 50 ~ 100 एमएस से कम लेता है। इसलिए हम इस बात पर सहमत हुए कि व्यवहार स्वीकार्य है।

बस फोकस सर्च को वापस लौटने के लिए विफल हो गया। यहां एक उदाहरण दिया गया है।

/** * 15-04-22 को sylversphere द्वारा बनाया गया। */ सार्वजनिक वर्ग DelayedNaviGridLayoutManager GridLayoutManager {

private final Context context; 

public SomeGridLayoutManager(Context context, int spanCount) { 
    super(context, spanCount); 
    this.context = context; 
} 

public SomeGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) { 
    super(context, spanCount, orientation, reverseLayout); 
    this.context = context; 
} 

@Override 
public View onFocusSearchFailed(View focused, int focusDirection, RecyclerView.Recycler recycler, RecyclerView.State state) { 
    return null; 
}} 
+0

काम न करें! पुनर्चक्रण दृश्य इस कोड के साथ नई पंक्ति नहीं बनाते हैं ... – Crisic

+1

मेरे लिए भी काम नहीं किया। – BonderWu

1

देखें this related post और आपकी समस्या का समाधान के लिए Vganin's answer फैली हुई है।

मैं AOSP समस्या ट्रैकर को यह बग रिपोर्ट: issue 190526

मैं स्रोत मुद्दा है से देख सकते हैं क्योंकि GridLayoutManager onFocusSearchFailed() जो कहा जाता है की LinearLayoutManager के कार्यान्वयन का उपयोग करता फोकस दृष्टिकोण जब की अंदरूनी सीमा RecyclerView। LinearLayoutManager का कार्यान्वयन केवल प्रथम/आखिरी प्रदान करता है (स्क्रॉलिंग दिशा पर पर निर्भर करता है) तत्व। इसलिए नई पंक्ति के पहले/अंतिम तत्व पर कूदें।

My workaround for this issue.

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