2016-09-15 5 views
0

Я пытаюсь построить пользовательский RecyclerViewRecyclerView в этой компоновке первой строки должны отличаться от остальных строк, как показано на этом рисункеRecyclerView ведет себя неожиданно

custom recyclerview

Я искал и нашел некоторые ресурсы и получили решение для пользовательского адаптера для RecyclerView в

public class PostDetailAdapter extends RecyclerView.Adapter<ViewHolder> { 

    private static final String TAG = PostDetailAdapter.class.getName(); 

    private List<Solution> mSolutionList; 
    private Issue mIssue; 

    private Context mContext; 
    public static final int ISSUE = 0; 

    public PostDetailAdapter(Context mContext, Issue mIssue, List<Solution> mSolutionList){ 
     this.mContext = mContext; 
     this.mIssue = mIssue; 
     this.mSolutionList = mSolutionList; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
     View v; 
     try { 
      if (viewType == ISSUE) { 
       v = LayoutInflater.from(viewGroup.getContext()) 
         .inflate(R.layout.row_detail_issue, viewGroup, false); 
       return new PostDetailViewHolder(v); 
      } else { 
       v = LayoutInflater.from(viewGroup.getContext()) 
         .inflate(R.layout.row_detail_solution, viewGroup, false); 
       return new AnswerDetailViewHolder(v); 
      } 
     }catch (Exception e){ 
      Toast.makeText(mContext, "Error caused by " + e.getCause(), Toast.LENGTH_SHORT).show(); 
      Log.e(TAG, "Error caused by " + e.getCause()); 
      return null; 
     } 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, int position) { 
     try { 
      if (viewHolder.getItemViewType() == ISSUE) { 
       PostDetailViewHolder postDetailViewHolder = (PostDetailViewHolder) viewHolder; 
       postDetailViewHolder.setTitleText(mIssue.getQ()); 
       postDetailViewHolder.setDescText(mIssue.getD()); 
      } else { 
       AnswerDetailViewHolder answerDetailViewHolder = (AnswerDetailViewHolder) viewHolder; 
       answerDetailViewHolder.setDescText(mSolutionList.get(position).getD()); 
      } 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (position == 0) {     
      return 0; 
     } else{     
      return 1; 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return (null != mSolutionList) ? mSolutionList.size() : 0/0;    

    } 

} 

в MainActivity

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mRecycler = (RecyclerView)findViewById(R.id.post_detail_recycler_view); 
    mRecycler.setHasFixedSize(true); 

    mSolutionList = populateSolutionList(); 

    mAdapter = new PostDetailAdapter(MainActivity.this, new Issue("Issue title", "Issue Desc"), mSolutionList); 

    // Set up Layout Manager 
    mManager = new LinearLayoutManager(MainActivity.this); 
    mManager.setReverseLayout(false); 
    mManager.setStackFromEnd(false); 

    mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL); 
    mStaggeredGridLayoutManager.setReverseLayout(false); 
    mRecycler.setLayoutManager(mStaggeredGridLayoutManager); 

    mRecycler.setAdapter(mAdapter);  


} 

private List<Solution> populateSolutionList() { 

    List<Solution> solutions = new CopyOnWriteArrayList<>(); 

    solutions.add(new Solution("Solution1")); 
    solutions.add(new Solution("Solution2")); 
    solutions.add(new Solution("Solution3")); 
    solutions.add(new Solution("Solution4")); 
    solutions.add(new Solution("Solution5")); 
    solutions.add(new Solution("Solution6")); 
    solutions.add(new Solution("Solution7")); 
    solutions.add(new Solution("Solution8")); 
    solutions.add(new Solution("Solution9")); 

    return Solutions; 
} 

в этой точке с предварительно заполненные List<Soultion> он работает хорошо, и, как ожидается, но когда я хочу, чтобы удалить populateSolutionList() и добавить Solution к кликам в

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mCount +=1; 
      Solution solution = new Solution("Solution " + mCount); 
      mSolutionList.add(solution); 
      mAdapter.notifyDataSetChanged(); 
      Log.e("MAIN_ACTIVITY", "Click return..." + mCount); 
     } 
    }); 

в адаптере Я изменил

@Override 
    public int getItemCount() { 
     try { 
      if (!mSolutionList.isEmpty()){ 
       int i = (null != mSolutionList) ? mSolutionList.size() : 0/0; 
       return (i); 
      }else { 
       return 1; 
      } 
     }catch (Exception e){ 
      return 0; 
     } 

    } 

, когда я нажимаю первую строку решения, добавляется, но не отображается в RecyclerView, все остальные показаны, я выяснил, что это проблема с адаптером getItemCount() любой предлагаю мне, как я могу решить thi s

+0

Похоже, вам необходимо увеличить 'itemCount' 1 для _issue_ элемента:' (нуль = mSolutionList!)? mSolutionList.size() + 1: 1' –

ответ

0

Вы должны учитывать первую строку в списке (проблема), и любое добавленное вами решение будет добавлено из второй строки. Ваш счет должен всегда быть +1.

Поэтому getItemCount() должен возвращать mSolutionList.size() + 1

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