2016-05-17 40 views
4

我有一個回收器視圖,直到我滾動時才顯示任何元素。一旦我滾動它,任何已完全離屏的項目都會顯示,但任何未完成的項目都不會顯示。RecycerView直到滾動後才顯示

片段類:

public class ImageAndNavHeaderFragment extends Fragment { 
    private NetworkImageView mBackgroundImage; 
    private RecyclerView mScrollingTextNavBar; 
    private ScrollingTextNavBarAdapter mScrollingBarAdapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.image_and_nav_header, container, false); 
     mBackgroundImage = (NetworkImageView) view.findViewById(R.id.bgImage); 
     mBackgroundImage.setImageUrl("http://crookedcreekguides.com/wp-content/uploads/2016/01/dinner-03.jpg", VolleySingleton.getInstance(getContext()).getImageLoader()); 
     mScrollingTextNavBar = (RecyclerView) view.findViewById(R.id.scrollTextNavBar); 


     LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); 
     layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); 
     mScrollingTextNavBar.setLayoutManager(layoutManager); 


     ArrayList<String> list = new ArrayList<>(); 
     for(int i=0; i< 20; i++) { 
      list.add("Test " + i); 
     } 

     mScrollingBarAdapter = new ScrollingTextNavBarAdapter(getContext(), list); 
     mScrollingTextNavBar.setAdapter(mScrollingBarAdapter); 
     view.invalidate(); 
     return view; 
    } 
} 

適配器

public class ScrollingTextNavBarAdapter extends RecyclerView.Adapter<ScrollingTextNavBarAdapter.ViewHolder>{ 
    private List<String> mStrings; 
    private int mSelectedIndex = 0; 
    private int mSelectedColor; 
    private int mDefaultColor; 
    private ItemClickedListener mListener; 
    private Drawable mSelectedDrawable; 

    private class PositionClickListener implements View.OnClickListener{ 
     private int mPosition; 
     public PositionClickListener() { 
     } 

     @Override 
     public void onClick(View view){ 
      if(mPosition != mSelectedIndex) { 
       mSelectedIndex = mPosition; 
       notifyDataSetChanged(); 
       if(mListener != null) { 
        mListener.onClick(mPosition); 
       } 
      } 
     } 

     public void setPosition(int position) { 
      mPosition = position; 
     } 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView textView; 
     public PositionClickListener listener; 
     public ViewHolder(TextView view) { 
      super(view); 
      textView = view; 
      listener = new PositionClickListener(); 
     } 
    } 

    public ScrollingTextNavBarAdapter(Context context) { 
     mStrings = new ArrayList<>(); 
     init(context); 
    } 

    public ScrollingTextNavBarAdapter(Context context, List<String> items) { 
     mStrings = items; 
     init(context); 
    } 

    @SuppressWarnings("deprecation") 
    private void init(Context context){ 
     mSelectedColor = context.getResources().getColor(R.color.scrolling_text_nav_bar_text_selected_color); 
     mDefaultColor = context.getResources().getColor(R.color.scrolling_text_nav_bar_text_default_color); 
     mSelectedDrawable = context.getResources().getDrawable(R.drawable.scrolling_text_nav_bar_seected_drawable); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     TextView view = (TextView)LayoutInflater.from(parent.getContext()).inflate(R.layout.scrolling_text_nav_bar_item, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.textView.setText(mStrings.get(position)); 
     holder.textView.setTextColor(position == mSelectedIndex ? mSelectedColor : mDefaultColor); 
     holder.listener.setPosition(position); 
     holder.textView.setOnClickListener(holder.listener); 
     holder.textView.setBackground(position == mSelectedIndex? mSelectedDrawable : null); 
    } 

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

    public void addString(String text) { 
     mStrings.add(text); 
     notifyDataSetChanged(); 
    } 

    public void setItemClickedListener(ItemClickedListener listener) { 
     mListener = listener; 
    } 

} 

片段的xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    > 
    <com.android.volley.toolbox.NetworkImageView 
     android:id="@+id/bgImage" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     /> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/scrollTextNavBar" 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:layout_alignBottom="@id/bgImage" 
     /> 
</RelativeLayout> 

爲了進一步amusement-後我滾動一個項目到視圖和它的出現,點擊一項(它調用notifyDataSetChanged)將顯示所有這些。但是如果不進行滾動(即使有延遲),也無法解決問題。

+0

添加日誌記錄,以解決我的'onCreateViewHolder()'和'onBindViewHolder()',看看你是否滾動或在此之前他們獲取調用。另外,您是否嘗試過層次結構視圖以查看預滾動的內容是否存在但隱藏或缺失? – CommonsWare

+0

函數被調用前20個位置中的前11個。 –

+0

至於HierarchyViewer - 採取屏幕截圖的行爲會使所有內容都顯示出來。 –

回答

1

事實證明,我的RecyclerView中的元素需要一個固定的高度才能工作。將該高度設置爲40dp會導致視圖按預期工作。

+0

這是一種非常罕見的情況,不知道爲什麼會發生。我的情況是我給了行的最小寬度。對於其他人,我建議修改行寬/高度。 – RJFares

+0

我有同樣的問題,對我來說,解決方案是設置項目大小比recyclerview更大。例如,horizo​​ntal recyclerview layout_height =「69dp」和recyclerview項目layout_height =「70dp」。錯誤錯誤錯誤:/ –

2

我建議更新您的支持lib/recyclerView如果你還沒有。這可能是「wrap_content」問題。 'com.android.support:recyclerview-v7:23.2.1'

+0

謝謝,但我知道這一點,並已使用該版本。 –

+2

原來,問題是我的元素視圖需要一個固定的高度。改變圖書館並沒有什麼幫助,但無論如何都指出了這個問題並幫助我到達那裏。 –

+0

我很高興得到解決 – eralp

0

它被滾動到新的位置

layoutManager.scrollToPosition 
相關問題