1

나는 데이터베이스에서 읽은 데이터를 표시하는 CardView가있는 RecyclerView를 가지고 있습니다. 그리고 이것에는 아무런 문제가 없습니다.RecyclerView의 첫 번째 요소가되도록 선형 레이아웃을 추가하는 방법은 무엇입니까?

이제는 동일한 RecyclerView에있는 ImageView와 TextView를 모두 포함하는 선형 레이아웃을 추가하고 항상 RecyclerView의 첫 번째 요소로 만들고 싶습니다.

이것은 내가 원하는 것입니다. RecyclerView의 첫 번째 요소는 그 아래에있는 CardView의 어떤 선형 요소에도 관계없이 항상 선형 레이아웃입니다.

what i want to acheive

나는 다른 ViewType 내가 원하는 것이 아니다 데이터베이스에서 데이터의 따라 처리 할 것 같다 this link에서이 자습서를보십시오. 내가 원하는 무엇

이 선형 레이아웃은 RecyclerView에서 항상 첫 번째 요소)

2 정적)

1입니다.

나는 if(index == 0) in onCreateViewHolder`에서 안드로이드 스튜디오가 인식하지 못하는 색인을 확인합니다.

@Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if(index== 0) { 
      View feedInput = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_input, parent, false); 
      return new MyViewHolder(feedInput); 
     }else { 
      View feedItemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_item, parent, false); 
      return new MyViewHolder(feedItemView); 
     } 
    } 
+2

왜 LinearLayout이 RecyclerView에 있어야합니까? 그냥 위에 올려 놓을 수 있을까요? –

+1

@MichaelVescovo recyclerview가 스크롤 될 때 위로 스크롤 할 수 있도록 리사이클 뷰 안에 필요합니다. – ken

답변

3

LinearLayoutCardView을 모두 포함하는 레이아웃을 만들면 both_layout이라고 할 수 있습니다. LinearLayout의 가시성을 유지하십시오 GONE.에서

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = (View) LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.both_layout, parent, false); 
    // Inflate both the layout. 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    if (position == 0) { 
     holder.makeFirst(); 
    } 
} 

당신의 ViewHolder.makeFirstLinearLayout 볼 수 있도록하고 CardView를 제거합니다.

public void makeFirst() { 
    linearlayout.setVisibility(VISIBLE); 
    cardView.setVisibility(GONE); 
} 
+0

이 작품은 charmed로 – ken

+0

당신은 확실히 내 하루를 저장 .. 감사합니다 – ken

+0

당신은 오신 것을 환영합니다. –

2

당신이있는 LinearLayout이 recyclerView이 스크롤 경우에도, 항상 볼 수 있도록해야 할 경우, 당신은 RecyclerView 외부에있는 LinearLayout을 넣을 수 있습니다. 과 같이 수행하십시오있는 LinearLayout 당신이 어댑터의 위치를 ​​확인할 수 있습니다 목록의 첫 번째 요소가 될 필요가있는 경우는 첫 번째 위치 (인덱스 == 0)의 경우,

<RelativeLayout 
--your attribute--> 

    <LinearLayout 
    --your attributes--> 
     //Your LinearLayout elements here 
    </LinearLayout> 

    <RecyclerView 
    --your attributes--/> 

</RelativeLayout> 

을 함께 레이아웃을 팽창하여 LinearLayout, 그렇지 않으면 alredy를 사용하여 목록 항목 레이아웃으로 확장하십시오.

편집 :

그냥 getItemViewType()을 구현하고 onCreateViewHolder()viewType 매개 변수를 돌봐 :

다음은 예입니다.

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

다음 onCreateViewHolderviewType에 따라 다른 레이아웃을 팽창 :

그래서 당신이 그런 짓을.

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == 1) { 
     // inflate your first item layout & return that viewHolder 
    } else { 
     // inflate your second item layout & return that viewHolder 
    } 
} 
+0

은'if (index == 0)'이 내 선형 레이아웃을 부 풀린다는 것을 의미하고, 그렇지 않으면 카드 뷰를 팽창시킵니다. ?? – ken

+0

예, 정확히 :) –

+0

감사합니다. 시도해 봅시다. – ken

0

당신은 viewType을 찾아야한다, 아니 index :이 도움이

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

    class LinearViewHolder extends RecyclerView.ViewHolder { 

     public LinearViewHolder(View itemView){ 
     View feedInput = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_input, parent, false); 
      return new LinearViewHolder(feedInput); 
     } 
    } 

    class ItemViewHolder extends RecyclerView.ViewHolder { 

     public ItemViewHolder(View itemView){ 
     View feedItemView = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.feed_item, parent, false); 
      return new ItemViewHolder(feedItemView); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if(viewType == 0) { 
      return new LinearViewHolder(); 
     } else { 
       return new ItemViewHolder(); 
     } 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 
     if(holder.getItemViewType() == 0) { 
      LinearViewHolder linearHolder = LinearViewHolder(holder); 
     } else { 
       ItemViewHolder itemHolder = ItemViewHolder(holder); 
     } 
    } 
} 

희망.