2015-01-23 8 views
6

Ich habe eine RecyclerView mit GridLayoutManager, mit 2 Spalten pro Zeile. Weil die Entwicklung für Android TV ist, so dass ich den Fokus brauche, um zu navigieren.Seltsame Android RecyclerView (GridLayoutManager) Fokusverhalten

enter image description here

Es ist in Ordnung, wenn ich Schlüssel für alle sichtbaren Elemente navigieren mit nach unten. Zum Beispiel Punkt 1 -> Punkt 3 -> Punkt 5 -> Punkt 7 (nur teilweise sichtbar). Aber wenn ich Taste wieder nach unten drücken, wird der Fokus auf Punkt bewegen 10 statt 9.

enter image description here

Mein Rasteransicht Adapter ist:

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); 
     } 
    } 
} 

Jede Idee, wie dieses Problem zu lösen? Vielen Dank.

+1

Haben Sie diese Lösung am Ende? Das hat mein Leben für die letzten ein oder zwei Monate durcheinander gebracht. – Dreamingwhale

+0

Nein, ich habe noch keine Lösung gefunden. Aber es ist nicht sehr kritisch in meiner Anwendung, also habe ich es einfach dort behalten. Hoffe, dass jemand das Problem eines Tages lösen kann. –

+0

Die Navigationsdokumente sagen Folgendes: "Das Android-Framework wendet automatisch ein direktionales Navigationsschema an, das auf der relativen Position von fokussierbaren Elementen in Ihren Layouts basiert." Kannst du das nextFocusDown, nextFocusUp, etc. irgendwie in deinem Adapter einstellen? – Elrond

Antwort

0

Ich fand eine Hack-Antwort darauf. Es wird nicht scrollen, wenn die neue Zeile nicht aufgeblasen ist (so wird es warten auf die neue Zeile wird aufgeblasen.), Aber es dauert normalerweise weniger als 50 ~ 100 ms. Also stimmten wir zu, dass das Verhalten akzeptabel ist.

Nur onFocusSearchFailed erhalten, um null zurückzugeben. Hier ist ein Beispiel.

/** * Erstellt von sylversphere am 15-04-22. */ public class DelayedNaviGridLayoutManager erweitert 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

Nicht arbeiten! Die Recycleransicht erstellt keine neue Zeile mit diesem Code ... – Crisic

+1

Hat auch nicht für mich funktioniert. – BonderWu

1

Ansicht this related post und Vganin's answer für Ihr Problem zu lösen.

berichtete ich diesen Fehler zu AOSP issue tracker: issue 190526

Wie ich von der Quelle sehen das Problem ist, weil GridLayoutManager verwendet LinearLayoutManager Implementierung von onFocusSearchFailed(), die genannt ist, wenn der Fokus nähert sich dem Innenrand RecyclerView. LinearLayoutManager-Implementierung bietet nur erste/letzte (abhängig auf Scroll-Richtung) Element. Daher springt der Fokus auf das erste/letzte Element der neuen Zeile.

My workaround for this issue.