0

リサイクルビューを使用してカードのリストを作成したいが、カードの詳細を行うためにCustomAdapterとLayoutを作成する方法を理解できない。提供されているデータについては、homeDataリストを参照してください。カードのアドレスヘッダーを作成することはできますが、詳細の処理方法はわかりません。ヘッダーはカテゴリごとに扱う必要があります。カードごとに1つのアドレスしか使用せず、アドレスごとに毎月のリストを作成する必要があります。Android Cardviewでヘッダーと詳細を含むrecycleviewを使用する

また、詳細に月が複数行ある可能性があります。

助けていただけたら幸いです!

enter image description here

List<HomeAvailability> homeData = new ArrayList<>(); 
    homeData.add(new HomeAvailability("1111 Main St", "Jun")); 
    homeData.add(new HomeAvailability("1111 Main St", "Jul")); 
    homeData.add(new HomeAvailability("1111 Main St", "Aug")); 
    homeData.add(new HomeAvailability("1111 Park St", "Jul")); 
    homeData.add(new HomeAvailability("2222 Park St", "Aug")); 
    homeData.add(new HomeAvailability("2222 Oregon St", "Oct")); 
    homeData.add(new HomeAvailability("1111 Oregon St", "Nov")); 
    homeData.add(new HomeAvailability("1111 Oregon St", "Dec")); 
    homeData.add(new HomeAvailability("1111 Oregon St", "Jan")); 

MainActivity

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

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

    mLayoutManager = new LinearLayoutManager(this); 
    mRecyclerView.setLayoutManager(mLayoutManager); 

    MainAdapter mAdapter = new MainAdapter(homeData); 
    mRecyclerView.setAdapter(mAdapter); 
} 

CustomAdapter.java

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

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     CardView cv; 
     TextView address; 
     TextView month; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      cv = (CardView)itemView.findViewById(R.id.card_view); 
      address = (TextView)itemView.findViewById(R.id.address); 
      //month = (TextView)itemView.findViewById(R.id.month); 
     } 
    } 

    List<HouseAvailability> mDataset; 

    public CustomAdapter(List<HouseAvailability> myDataset) { 
     this.mDataset = myDataset; 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    @Override 
    public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, 
               int viewType) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout, viewGroup, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int i) { 
     holder.address.setText(mDataset.get(i).address); 
    } 

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

card_layout.xml

<android.support.v7.widget.CardView 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/card_view" 
    android:layout_gravity="center" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    card_view:cardCornerRadius="6dp"> 

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

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

     <TextView 
      android:id="@+id/address" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:maxLines="3" 
      android:padding="12dp" 
      android:textColor="#222" 
      android:textStyle="bold" 
      android:textSize="18dp" /> 

     <View 
      android:id="@+id/divider" 
      android:layout_below="@id/address" 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:layout_margin="4dp" 
      android:background="@android:color/black" /> 

     //Months here? 

     </RelativeLayout> 


    </RelativeLayout> 

</android.support.v7.widget.CardView> 
+0

あなたは 'homeData'を制御できますか?リストの作成方法を変更できますか?そうであれば、代わりに住所ごとに1つのエントリを持ち、それぞれが月のリストを保持しているアイテムのリストを作成するべきです – marmor

+0

はい、推奨されている場合はデータを操作できます。私は、アダプタを使って作業するより良い方法があれば、データを準備するループを始めたいとは思っていませんでした –

答えて

2

現在のデータセットで目標を達成することは可能ですが、項目ごとにアドレスデータが1つしかない別のデータセットを作成することをおすすめします。あなたはgetItemCount()getItemType()onCreateViewHolder()onBindViewHolder()を変更する必要があなたの現在のセットでそれを行うたい場合はとにかく



コード例

(私はこのコードをテストしていない、それは手書きです。)

あなたのデータクラスは、この方法のように変更していると仮定します。

class HouseAvailability 
{ 
    public String address; 
    public ArrayList<String> monthList; 
} 

CustomAdapter.java

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

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     CardView cv; 
     TextView address; 
     TextView month; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      cv = (CardView)itemView.findViewById(R.id.card_view); 
      address = (TextView)itemView.findViewById(R.id.address); 
      month = (TextView)itemView.findViewById(R.id.month); 
     } 

     public void bindData(HouseAvailability data) { 
      this.address.setText(data.address); 
      String monthStr = ""; 
      for(int i=0; i<data.monthList.size(); i++) { 
       monthStr += data.monthList.get(i); 
       if(i<data.monthList.size()-1) { 
        if(i%4 == 3) 
         monthStr += "\n" 
        else 
         monthStr += " " 
       } 
      } 
      this.month.setText(monthStr); 
     } 
    } 

    List<HouseAvailability> mDataset; 

    public CustomAdapter(List<HouseAvailability> myDataset) { 
     this.mDataset = myDataset; 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    @Override 
    public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, 
               int viewType) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_layout, viewGroup, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int i) { 
     holder.bindData(mDataset.get(i)); 
    } 

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

とXML部分:あなたが望むよう

<android.support.v7.widget.CardView 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/card_view" 
    android:layout_gravity="center" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    card_view:cardCornerRadius="6dp"> 

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

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

     <TextView 
      android:id="@+id/address" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:maxLines="3" 
      android:padding="12dp" 
      android:textColor="#222" 
      android:textStyle="bold" 
      android:textSize="18dp" /> 

     <View 
      android:id="@+id/divider" 
      android:layout_below="@id/address" 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:layout_margin="4dp" 
      android:background="@android:color/black" /> 

     <TextView 
      android:id="@+id/month" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:maxLines="3" 
      android:padding="12dp" 
      android:textColor="#222" 
      android:textStyle="bold" 
      android:textSize="18dp" /> 

     </RelativeLayout> 


    </RelativeLayout> 

</android.support.v7.widget.CardView> 

あなたは詳細を変更することができます。

+0

CustomAdapterとXMLの見え方を示せますか? –

+0

@ Mark_1955月のテキストが1行を超えると、どのようにしてその月のテキストを整形しますか?グリッドビュー、サイドスクロール、または単に改行? –

+0

住所が5か月であれば、5ヵ月目はカード本体の新しい明細行に表示されます。個々のカードは、2つの行を表示しているため、縦方向にさらに大きくなります。同じルールが9ヶ月間適用されると、アドレスヘッダーの3行下になります。 –

関連する問題