2015-01-23 19 views
6

Tôi có một RecyclerView với GridLayoutManager, với 2 cột mỗi hàng. Vì sự phát triển dành cho Android TV nên tôi cần tập trung để điều hướng.Strange Android RecyclerView (GridLayoutManager) hành vi tập trung

enter image description here

Đó là ok nếu tôi đang sử dụng phím để di chuyển đến bất kỳ mục hiển thị. Ví dụ: Mục 1 -> Mục 3 -> Mục 5 -> Mục 7 (Chỉ hiển thị một phần.). Nhưng khi tôi nhấn phím một lần nữa, trọng tâm sẽ chuyển sang mục 10 thay vì 9.

enter image description here

My lưới xem bộ chuyển đổi là:

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

Bất kỳ ý tưởng làm thế nào để giải quyết vấn đề này? Cảm ơn.

+1

Cậu kết thúc giải quyết này? Điều này đã làm rối tung cuộc sống của tôi trong một hoặc hai tháng qua. – Dreamingwhale

+0

Không, tôi chưa tìm thấy giải pháp nào. Nhưng nó không phải là rất quan trọng trong ứng dụng của tôi vì vậy tôi chỉ giữ nó ở đó. Hy vọng ai đó có thể giải quyết vấn đề một ngày nào đó. –

+0

Tài liệu điều hướng nói điều này "Khung nền Android tự động áp dụng lược đồ điều hướng hướng dựa trên vị trí tương đối của các phần tử có thể đặt tiêu điểm trong bố cục của bạn". Bạn có thể đặt nextFocusDown, nextFocusUp, v.v. trong bộ điều hợp của bạn bằng cách nào đó không? – Elrond

Trả lời

0

Tôi đã tìm ra câu trả lời cho câu hỏi này. Nó sẽ không cho phép bạn di chuyển trừ khi hàng mới được tăng cao (Vì vậy, nó sẽ chờ đợi trên hàng mới được tăng cao.) Nhưng nó thường mất ít hơn 50 ~ 100 ms. Vì vậy, chúng tôi đã đồng ý rằng hành vi này có thể chấp nhận được.

Chỉ nhận được onFocusSearchFailed để trả về giá trị rỗng. Đây là một ví dụ.

/** * Được tạo bởi sylversphere vào ngày 15-04-22. */public class DelayedNaviGridLayoutManager kéo dài 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

Không hoạt động! Chế độ xem tái chế không tạo hàng mới với mã này ... – Crisic

+1

Không hoạt động đối với tôi. – BonderWu

1

Xem this related postVganin's answer cho giải quyết vấn đề của bạn.

Tôi đã báo cáo lỗi này để AOSP theo dõi vấn đề: issue 190526

Như tôi đã có thể nhìn thấy từ nguồn vấn đề là vì GridLayoutManager sử dụng thực hiện onFocusSearchFailed() mà là gọi LinearLayoutManager khi tập trung tiếp cận biên giới bên trong của RecyclerView. Việc thực hiện LinearLayoutManager chỉ cung cấp phần tử đầu tiên/cuối cùng (phụ thuộc trên hướng cuộn). Do đó, hãy tập trung nhảy đến phần tử đầu tiên/cuối cùng của hàng mới.

My workaround for this issue.

Các vấn đề liên quan