2015-12-14 19 views
5

In meinem Feuer tv app verwende ich eine recyclerview mit horizontal layout.RecyclerView Artikel verlieren Fokus

Scrollen mit dpad funktioniert und auch Elemente gewinnen im Fokus.

Aber wenn ich den Knopf halte, scrollt es sehr schnell, weil viele Keydown-Ereignisse ausgelöst werden, und Gegenstände verlieren ihren Fokus und es ist nicht mehr möglich zu blättern, weil ein anderer über meinem Recyclerview den Fokus gewinnt.

Es sieht aus wie ein Fehler. Gibt es einen Workaround dafür?

+0

Für diejenigen, die das gleiche Problem konfrontiert sein werden. Ich habe einen Workaround dafür gefunden. Ich verwende RecyclerView nicht mehr. Ich habe zu dieser HorizontalListView-Bibliothek gewechselt: https://github.com/sephiroth74/HorizontalVariableListView, was für meine Bedürfnisse ausreichend ist. – sNore

Antwort

2

ich vor dem gleiche Problem, was ich in meinem Projekt zu tun mag unten in meiner Tätigkeit (mit RecyclerView):

private long mLastKeyDownTime = 0; 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     long current = System. currentTimeMillis(); 
     boolean res = false; 
     if (current - mLastKeyDownTime < 300) { 
      res = true; 
     } else { 
      res = super.onKeyDown(keyCode, event); 
      mLastKeyDownTime = current; 
     } 
     return res; 
    } 

, die dem schnellen Scrollen vermeidet, wenn Sie die Taste auf der dpad halten, und der Fokus funktioniert gut in meinem RecyclerView.

+0

thx, ich werde das in meinem nächsten Projekt versuchen! – sNore

0

Ich habe das gleiche Problem konfrontiert. Die gute Nachricht war, dass beliebte Apps (YouTube und andere) dieses Problem nicht haben. Ich fand informative resource. Nach der Untersuchung habe ich eine Lösung gefunden, die mir passt. Der Schlüssel ist Presenter statt Adapter zu verwenden Es ist das einfachste Beispiel

//Presenter class 
public class ItemViewPresenter extends Presenter { 

    @Override 
    public final ViewHolder onCreateViewHolder(ViewGroup parent) { 

     //I use data binding 
     ItemBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item, parent, false); 
     return new MyViewHolder(binding); 
    } 

    @Override 
    public final void onBindViewHolder(ViewHolder viewHolder, Object item) { 
     String text = (String) item; 
     ((MyViewHolder) viewHolder).bind(text); 
    } 

    @Override 
    public final void onUnbindViewHolder(ViewHolder viewHolder) { 
    } 

    private class MyViewHolder extends Presenter.ViewHolder { 

     private final ItemBinding binding; 

     private DiscoveryViewHolder(ItemBinding binding) { 
      super(binding.getRoot()); 
      this.binding = binding; 
     } 

     private void bind(String text) { 

      binding.textView.setText(text); 
     } 
    } 
} 

//... 
private void setupRecyclerView() { 

    RecyclerView recyclerView = _baseLayout.findViewById(R.id.recyclerView); 

    ArrayObjectAdapter arrayObjectAdapter = new ArrayObjectAdapter(new ItemViewPresenter()); 

    ItemBridgeAdapter bridgeAdapter = new ItemBridgeAdapter(arrayObjectAdapter); 

    recyclerView.setAdapter(bridgeAdapter); 

    LinearLayoutManager layoutManager = new LinearLayoutManager(_baseLayout.getContext(), LinearLayoutManager.HORIZONTAL, false); 
    recyclerView.setLayoutManager(layoutManager); 

    List<Strings> textList = new ArrayList(1); 
    textList.add("1"); 

    //add objects 
    arrayObjectAdapter.addAll(0, textList); 

    //clear objects 
    //arrayObjectAdapter.clear(); 
}