2015-01-23 34 views
6

GridLayoutManager ile her satırda 2 sütun ile bir RecyclerView var. Geliştirmek Android TV için olduğundan, gezinmek için odaklanmam gerekiyor. Ben herhangi bir görünür Öğeler arasında gezinmek için tuşuna basılı kullanıyorsamGarip Android RecyclerView (GridLayoutManager) odak davranışı

enter image description here

Sorun değil. Örneğin, Madde 1 -> Madde 3 -> Madde 5 -> Madde 7 (Sadece kısmen görünür.). Tekrar tuşunu basılı bastığınızda Fakat, odak Madde 10 yerine 9 arasındaki hareket edecek

enter image description here

Benim ızgara görünümü adaptör geçerli:

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

herhangi bir fikir nasıl bu sorunu çözmek için? Teşekkürler.

+1

Bu çözme sona mü? Bu, geçen ay ya da iki yıl boyunca hayatımı mahvediyor. – Dreamingwhale

+0

Hayır, henüz bir çözüm bulamadım. Ama benim uygulamada çok kritik değil, o yüzden orada tuttum. Umarım birileri sorunu bir gün çözebilir. –

+0

Gezinme belgeleri bunu söylüyor: "Android çerçevesi otomatik olarak, düzenlerinizdeki odaklanabilir öğelerin göreceli konumuna dayalı bir yön bulma şemasını uygular." Adaptörünüzde nextFocusDown, nextFocusUp, vb. Ayarlayabilir misiniz? – Elrond

cevap

0

Bunun için bir kesmek cevabı buldum. Yeni satır şişirilmedikçe kaydırma yapmanıza izin vermeyecek (Bu nedenle, yeni satırın şişirilmesini bekleyecektir.) Ancak normal olarak 50 ~ 100 ms'den az sürer. Bu yüzden davranışın kabul edilebilir olduğuna karar verdik.

Yalnızca boşa dönmek içinFocusSearchFailed'e gidin. İşte bir örnek.

/** * sylversphere tarafından 15-04-22 tarihinde düzenlendi. */ public class 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

Çalışmıyor! Geri dönüşümcü görünümü bu kodla yeni satır oluşturmuyor ... – Crisic

+1

Benim için de işe yaramadı. – BonderWu

1

Görünüm this related post ve sorunu çözmek için Vganin's answer uzanır. GridLayoutManager denilen olan onFocusSearchFailed() ait LinearLayoutManager uygulanması konusunda kullandığı için issue 190526

Ben konudur kaynaktan görebileceğiniz gibi odak iç sınırına yaklaşırken zaman:

Ben AOSP sorun izleyicide için bu hatayı bildirdi RecyclerView. LinearLayoutManager'ın uygulaması sadece ilk/son teklifleri (kaydırma yönünde 'a bağlıdır) elemanını sunar. Bu nedenle odak, yeni satırın ilk/son öğesine atlar.

My workaround for this issue.

İlgili konular