2016-10-03 35 views
0

我正在設計一個關於不同旅行方式的應用程序。所以我有一個Android的數據源,有許多不同類別的業務列表。類別是汽車,自行車和飛機。所以想象一張擁有多輛汽車的列表,其次是許多自行車,其次是許多飛機。我想用recyclerView將這些分開。但我不知道如何創建部分/類別?Android recyclerView - 如何知道我在哪個部分?

我有一個模型(數據源),我可以打電話來獲得像這樣的每個類別: model.getAirplanesList(); model.getCarsList(); model.getBikesList();

有3種不同的型號會更好嗎?所以我需要最終產品先顯示:

1. list of airplanes 
    2. then a list of cars 
    3. last a list of bikes 

我需要它有每個部分的標題。我怎麼知道我在哪一節?

的3個類別將使用相同的佈局文件,使viewType可以保持不變我以爲:

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

     return new MyViewHolder(itemView); 
    } 

//我應該以某種方式利用viewType?

,並在onBindViewHolder我很困惑,我怎麼能知道我在哪一部分到目前爲止,我只工作了飛機。

@Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     Transport transport = model.get(position).getAirplanesList(); 
     holder.title.setText(transport.getTitle()); 
     holder.genre.setText(transport.getGenre()); 
     holder.year.setText(transport.getYear()); 

//what about Cars and bikes. how to know what section i am in ? 
    } 

我希望我的數據通過像類/條訂購這樣的:

enter image description here

回答

1

您可以使用庫SectionedRecyclerViewAdapter將數據分組爲段。

首先創建一個科類:

class MySection extends StatelessSection { 

    String title; 
    List<Transport> list; 

    public MySection(String title, List<Transport> list) { 
     // call constructor with layout resources for this Section header, footer and items 
     super(R.layout.section_header, R.layout.transports_list_row); 

     this.title = title; 
     this.list = list; 
    } 

    @Override 
    public int getContentItemsTotal() { 
     return list.size(); // number of items of this section 
    } 

    @Override 
    public RecyclerView.ViewHolder getItemViewHolder(View view) { 
     // return a custom instance of ViewHolder for the items of this section 
     return new MyItemViewHolder(view); 
    } 

    @Override 
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) { 
     MyItemViewHolder itemHolder = (MyItemViewHolder) holder; 

     // bind your view here 
     Transport transport = list.get(position); 
     itemHolder.title.setText(transport.getTitle()); 
     itemHolder.genre.setText(transport.getGenre()); 
     itemHolder.year.setText(transport.getYear()); 
    } 

    @Override 
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) { 
     return new SimpleHeaderViewHolder(view); 
    } 

    @Override 
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) { 
     MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder; 

     // bind your header view here 
     headerHolder.tvItem.setText(title); 
    } 
} 

然後您設置RecyclerView與節:

// Create an instance of SectionedRecyclerViewAdapter 
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter(); 

// Add your Sections to the adapter 
sectionAdapter.addSection(new MySection("Airplanes", model.getAirplanesList())); 
sectionAdapter.addSection(new MySection("Cars", model.getCarsList())); 
sectionAdapter.addSection(new MySection("Bikes", model.getBikesList())); 

// Set up your RecyclerView with the SectionedRecyclerViewAdapter 
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); 
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
recyclerView.setAdapter(sectionAdapter); 
0

你在正確的軌道,你可以利用getItemViewType()找到ViewHolder類型應創建並在接下來的方法進行填充,基於對象類型或利弊traint。這意味着你可以有單獨的模型或只有一個模型並應用約束(小心,這不應該是繁重的操作),以返回正確的視圖類型。

簡單的檢查,通過約束類型:

@Override 
public int getItemViewType(int position){ 
    TransporationModel transportation = mList.get(position); 
    if(transporation.isBike()){ return VIEW_TYPE_BIKE; 
    else if(transporation.isBus()){ return VIEW_TYPE_BUSE; 
    //..etc 

} 
+0

好的。但我如何分組他們? – j2emanue

+0

如果你有不同的模型,讓他們實現通用接口,在這個接口下你傳遞同類對象列表到適配器,比如'List >',所有'BusTransporationModel','BikeTransporationModel'都實現這個接口,所以你可以將它們分組在同一個列表中沒有使用'List >'。 –

+0

我只有一個模型。這個模型被稱爲商業。在裏面的企業我有飛機列表,bikeList和carlist。你能推薦我怎麼可以這樣做呢?你能用代碼開始我嗎? – j2emanue

0

可能幫你。 適配器getView方法做這樣的

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 

     final Item i = items.get(position); 
     if (i != null) { 
      if (i.isSection()) { 

       SectionItem si = (SectionItem) i; 
       v = vi.inflate(R.layout.list_item_section, null); 
        v.setOnClickListener(null); 
       v.setOnLongClickListener(null); 
       v.setLongClickable(false); 

       TextView sectionView = (TextView) v 
         .findViewById(R.id.list_item_section_text); 
       sectionView.setTextColor(Color.GRAY); 
       sectionView.setText(si.getTitle()); 


      } else if (i.isItem()) { 

       Exam exam = (Exam) i; 
       v = vi.inflate(R.layout.exampanel, null); 

       TextView examtopic = (TextView) v.findViewById(R.id.topic_title); 
       TextView examcontent = (TextView) v.findViewById(R.id.listcontent); 
       TextView datetimetext = (TextView) v.findViewById(R.id.datetime); 
       TextView colortext = (TextView) v.findViewById(R.id.color_text);      

      } 

     } 
     return v; 
    } 

謝謝。

+0

這是如何讓他們按類別排序?你所做的是添加節名稱。但是這些部分中的數據不是按類別排序的。它遍佈各處。我錯了嗎 ?我想要的是有序的東西。我想要一份汽車清單,一張飛機清單和一份列入正確類別的自行車清單。它就像一個3個單獨的列表,但如果可能的話,它們都具有相同的recyclerview。 – j2emanue

+0

我想我明白你的暗示了。我應該將所有數據保存在一個列表中,但是要將它們分開。現在我在1個模型中有3個列表,但我假設你的意思是最好有1個列表,並在數組列表中放置像「#」這樣的部分來指定一個部分。 – j2emanue

+0

您只需將該列表添加到單個列表中,並將該列表傳遞給自定義適配器。所以每個列表都有獨立的模塊類。然後通過模塊類在自定義適配器中分離該列表。 –

0

我發現多段最大的圖書館是由EPOXY Airbnb住宿。使它變得如此簡單。解決了我的問題。

+0

我有問題讓生成的生成類工作。 _修復後的類沒有生成。你能提供一些指導方針嗎? –

+1

我一段時間都沒有用過它,所以忘了詳細的遺憾.. https://medium.com/airbnb-engineering/epoxy-airbnbs-view-architecture-on-android-c3e1af150394 – j2emanue

相關問題