2016-06-20 3 views
1

Goodd day.I имеет простой вид ресайклеров с простейшими фиктивными данными для целей тестирования, поэтому у меня есть странная проблема, с которой Google не нашел решения или даже проблемы вообще. На первом запуске вид все хорош, но как только я начинаю скрутить, детские предметы находятся так далеко друг от друга, что никто не может имитировать ... На самом деле очень и очень далеко. Но проблема в том, что фактические параметры макета для дочерних элементов верны, только проблема в том, что я не знаю, почему RecyclerView решает, что каждый элемент кучи далеко друг от друга. Пожалуйста, вы можете мне помочь? Проводка полного кода моего RecyclerView.Проблема с прокруткой RecyclerView (дочерние элементы далеко друг от друга)

Вид на recyclerView

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.ink.activities.HomeActivity" 
    tools:showIn="@layout/app_bar_home"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="vertical" /> 
</RelativeLayout> 

адаптер.

public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.ViewHolder> { 

    private List<FeedModel> feedList; 
    private Context mContext; 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView title, content; 

     public ViewHolder(View view) { 
      super(view); 
      title = (TextView) view.findViewById(R.id.feedTitle); 
      content = (TextView) view.findViewById(R.id.feedContent); 
     } 
    } 


    public FeedAdapter(List<FeedModel> feedList, Context context) { 
     mContext = context; 
     this.feedList = feedList; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.feed_single_view, parent, false); 

     return new ViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     FeedModel feedModel = feedList.get(position); 
     holder.title.setText(feedModel.getTitle()); 
     holder.content.setText(feedModel.getContent()); 

//  animate(holder); 
    } 


    public void animate(RecyclerView.ViewHolder viewHolder) { 
     final Animation animAnticipateOvershoot = AnimationUtils.loadAnimation(mContext, R.anim.bounce_interpolator); 
     viewHolder.itemView.setAnimation(animAnticipateOvershoot); 
    } 

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

Я думаю, вам не понадобится держатель, так как с ним не началось представление. Вид одного дочернего элемента адаптера RecyclerView.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.v7.widget.CardView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="10dp" 
     android:clickable="true" 
     android:foreground="?android:attr/selectableItemBackground" 
     app:cardCornerRadius="5dp" 
     app:cardElevation="10dp"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <TextView 
       android:id="@+id/feedTitle" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerHorizontal="true" 
       android:layout_marginTop="10dp" 
       android:fontFamily="@string/appFont" 
       android:text="loading...." 
       android:textColor="#000000" 
       android:textSize="20sp" /> 

      <TextView 
       android:id="@+id/feedContent" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_below="@+id/feedTitle" 
       android:layout_marginLeft="2dp" 
       android:layout_marginRight="2dp" 
       android:layout_marginTop="10dp" /> 
     </RelativeLayout> 
    </android.support.v7.widget.CardView> 
</LinearLayout> 

Начало фактических параметров.

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

     mAdapter = new FeedAdapter(mFeedModelArrayList, this); 
     RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); 
     itemAnimator.setAddDuration(500); 
     itemAnimator.setRemoveDuration(500); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     mRecyclerView.setItemAnimator(itemAnimator); 

Этот код так же просто, как он может получить, и это важно отметить, что я инициацию все это внутри по умолчанию NAVIGATION DRAWER ACTIVITY Андроида студии (templae по умолчанию внутри content_main layout) .so Plaese вы можете дать мне какой-нибудь намекнуть на проблему?

+0

Изменения в последней версии RecyclerView, попробуйте установить высоту представления child на wrap_parent на верхнем уровне. Изменение вызывает представления match_parent, где старые версии принудительно завершают wrap_content. – wblaschko

ответ

3

Вы используете

android:layout_width="match_parent" 
android:layout_height="match_parent" 

на ваших представлениях элементов ребенка. По Support Library 23.2:

виджет RecyclerView обеспечивает передовую и гибкую основу для создания списков и сетей, а также поддержки анимации. Этот выпуск приносит новую функциональность API LayoutManager: автоматическое измерение! Это позволяет RecyclerView самостоятельно определять размер содержимого. Это означает, что ранее недоступные сценарии, такие как использование WRAP_CONTENT для измерения RecyclerView, теперь возможны. Вы найдете, что все встроенные LayoutManager теперь поддерживают автоматическое измерение.

Из-за этого изменения убедитесь, что вы дважды проверьте параметры макета ваших позиций: ранее игнорированные параметры макета (такие как MATCH_PARENT в направлении прокрутки) теперь будут полностью соблюдены.

Измените ваш layout_height на wrap_content, если вы только хотите, чтобы ваши пункты, чтобы быть столь же большим, как это необходимо. match_parent означает, что они будут размером с экран.

+0

Отлично !!!! Я просто играл вокруг и хотел поставить свой собственный ответ в качестве решения, поскольку я обнаружил, что просмотр ресайклера не похож на listView или любой другой, поэтому ROOT-макет ДОЛЖЕН иметь высоту wrap_content! Отлично! Спасибо вам большое! –

Смежные вопросы