2015-09-11 4 views
0

У меня проблемы с RecyclerView, когда я пытаюсь создать новое дочерние представления в родительском представлении. Когда я прокручиваю, он выглядит пустым на секунду. От привязки данных или рендеринга представления?RecyclerView вложенные дочерние представления ViewHolder

Вот мой код:

public class TournamentFixtureAdapter extends LoadMoreRecyclerViewAdapter<FixtureGroup> { 
    private OnFixtureClickListener onFixtureClickListener = null; 

    public TournamentFixtureAdapter(List<FixtureGroup> data) { 
     super(data); 
    } 

    @Override 
    protected RecyclerView.ViewHolder onCreateContentItemViewHolder(ViewGroup parent, int contentViewType) { 
     return new TournamentFixtureHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_tournament_fixture, parent, false)); 
    } 

    @Override 
    protected void onBindContentItemViewHolder(RecyclerView.ViewHolder holder, int position) { 
     super.onBindContentItemViewHolder(holder, position); 
     FixtureGroup fixtureGroup = data.get(position); 
     ((TournamentFixtureHolder) holder).onFixtureClickListener = onFixtureClickListener; 
     ((TournamentFixtureHolder) holder).parentPos = position; 
     ((TournamentFixtureHolder) holder).binding.setFixtureGroup(fixtureGroup); 
     ((TournamentFixtureHolder) holder).addFixtures(fixtureGroup.getFixtures()); 
    } 

    public void setOnFixtureClickListener(OnFixtureClickListener onFixtureClickListener) { 
     this.onFixtureClickListener = onFixtureClickListener; 
    } 

    static class TournamentFixtureHolder extends FixtureHolder { 
     ListItemTournamentFixtureBinding binding = null; 

     public TournamentFixtureHolder(View itemView) { 
      super(itemView); 
      binding = DataBindingUtil.bind(itemView); 
     } 
    } 
} 

public class FixtureHolder extends BaseAdapter.BaseHolder { 
    LinearLayout   layoutMain    = null; 
    OnFixtureClickListener onFixtureClickListener = null; 
    int parentPos; 

    public FixtureHolder(View itemView) { 
     super(itemView); 
     layoutMain = (LinearLayout) itemView.findViewById(R.id.layout_main); 
     setIsRecyclable(layoutMain.getChildCount() > 0); 
    } 

    public void addFixtures(final ArrayList<Fixture> fixtures) { 

     for (final Fixture fixture : fixtures) { 
      LinearLayout parent = (LinearLayout) LayoutInflater.from(itemView.getContext()).inflate(R.layout.view_fixture, null); 

      Utils.getDefaultClubLogo((NetworkImageViewPlus) parent.findViewById(R.id.netview_home_img)).setImageUrl(fixture.getHome().getImg(), AppController.getInstance().getImageLoader()); 
      Utils.getDefaultClubLogo((NetworkImageViewPlus) parent.findViewById(R.id.netview_away_img)).setImageUrl(fixture.getAway().getImg(), AppController.getInstance().getImageLoader()); 
      ViewFixtureBinding binding = DataBindingUtil.bind(parent); 

      layoutMain.addView(parent); 
      binding.setFixture(fixture); 

      parent.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        onFixtureClickListener.onFixtureClick(parentPos, findFixturePosById(fixtures, fixture.getId())); 
       } 
      }); 
     } 
    } 

    private int findFixturePosById(ArrayList<Fixture> fixtures, int id) { 
     for (int i = 0; i < fixtures.size(); i++) { 
      if (fixtures.get(i).getId() == id) { 
       return i; 
      } 
     } 
     return 0; 
    } 
} 
+0

Я предполагаю, что у вас есть расширенный LoadMoreRecyclerViewAdapter для RecyclerView.Adapter, почему вы все это не делаете внутри LoadMoreRecyclerViewAdapter –

+0

@ L-X Я использую два вида в этом адаптере. Один для последнего элемента, чтобы сделать индикатор круга для загрузки большего количества данных, а второй для обычного просмотра. Таким образом, в адаптере есть два держателя для отображения. –

ответ

0

Если проблема была больше на стороне данных (адаптер), то это, вероятно, будет появляться на обычной схеме, а не только во время прокрутки. Например, если вы загружали изображения с медленного сервера, начальный показ был бы медленным. Поскольку это происходит только при прокрутке, это указывает на проблему с менеджером компоновки.

Для каждого нового вида вы должны получить его от адаптера и добавить его в макет. Если вы разрешаете максимальную dx в горизонтальной/вертикальной прокрутке и имеете переработанные виды за пределами экрана, в кешированном виде, вероятно, что все будет выглядеть пустым до того, как менеджер макета получит новые представления от адаптера и выложит их.

Так что есть два фактора - горизонтальный и/или вертикальный dx слишком велик, слишком скоро, а количество переработанных (или сломанных) видов слишком мало. Таким образом, решение - либо замедлить прокрутку, либо увеличить количество просмотров, которые вы добавляете за пределы экрана.

+0

Я думаю, что, возможно, будет увеличиваться количество просмотров. Не могли бы вы предоставить пример кода. –

+0

Если вы пишете свой собственный менеджер компоновки или продлеваете еще один - после вызова методов прокрутки (scrolledVerticallyBy, ScrollHorizontallyBy) - тогда вы находитесь под контролем - вы знаете, что такое dx, поэтому независимо от того, видят ли они пустое значение о том, выкладываете ли вы представления, прежде чем перенастраивать пользователя на новое место. Просто убедитесь, что новые представления выложены до смещения пользователя в эту область, и не должно быть серого пространства. –

+0

Благодарим вас за помощь, но мне удалось это решить. Может быть, это маленький взлом, но он решает проблемы. Я переопределяю getContentItemViewType, возвращая размер дочерних представлений, которые мне нужно создать в onCreateContentItemViewHolder. Еще раз спасибо @Dennis Sheil –

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