2015-10-04 98 views
0

我想了解RecylerView.adapter的設計是什麼。 onCreateViewHolder方法接受視圖類型作爲參數。爲什麼bindViewHolder接受一個位置作爲參數?

onCreateViewHolder(ViewGroup parent, int viewType) 

當RecyclerView需要 給定類型的一個新RecyclerView.ViewHolder來表示一個項調用。

此視圖類型在getItemViewType

getItemViewType(int position) 

返回在用於視圖 回收的目的位置處的項目的視圖類型映射。

最後結合ViewHolder bindViewHolder時被稱爲

onBindViewHolder(VH holder, int position) 

通過RecyclerView調用在指定的位置處顯示的數據。

爲什麼在onBindViewHolder中放置一個參數?我的理解是,發送到onCreateViewHolder的viewType允許開發人員根據視圖類型創建適當的ViewHolder。如果是這種情況,onBindViewHolder中的位置是多餘的和不必要的。

我是否正確使用RecyclerView.adapter類?它讓我質疑我的理解,將位置參數傳遞給onBindViewHolder,它似乎尖叫着使用,但是在我當前的實現中哪些實際上沒有必要,因爲我的ViewHolders已經使用從位置映射的視圖類型創建。

回答

2

爲什麼在onBindViewHolder中放置參數?

所以你知道綁定到ViewHolder什麼數據。 RecyclerView旨在顯示數據的集合;一個ViewHolder將該集合中的一個項目綁定到其視圖。

如果是這種情況,onBindViewHolder中的位置是多餘且不必要的。

只有當你將始終使用RecyclerView與零或一個項目集合模型數據,在這種情況下,你不應該使用RecyclerView

我ViewHolders正在使用的是從位置

視圖類型是用於視圖明顯不同結構的,例如標題和細節映射到的視圖類型已經創建。視圖類型與位置無關,這就是爲什麼該位置不傳遞到onCreateViewHolder()

因此,例如,假設您想要顯示來自lorem ipsum列表的25個拉丁詞的垂直滾動列表。缺省情況是有一種視圖類型(即,您不覆蓋getItemViewType()),並且您將該單詞綁定到onBindViewHolder()中列表行的TextView(或其他)。

如果在執行25個單詞列表RecyclerView時,您使用的是25種視圖類型,那麼很可能您做錯了。唯一可能的情況是,如果每行在結構上會非常不同(第一行是TextView,第二行是ImageButton,第三行是ImageView加上Switch等)。

作爲一個例子,這裏是承載一個RecyclerView顯示一個25字的列表中的活動:

/*** 
    Copyright (c) 2008-2015 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    From _The Busy Coder's Guide to Android Development_ 
    https://commonsware.com/Android 
*/ 

package com.commonsware.android.recyclerview.simplelist; 

import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class MainActivity extends RecyclerViewActivity { 
    private static final String[] items={"lorem", "ipsum", "dolor", 
      "sit", "amet", 
      "consectetuer", "adipiscing", "elit", "morbi", "vel", 
      "ligula", "vitae", "arcu", "aliquet", "mollis", 
      "etiam", "vel", "erat", "placerat", "ante", 
      "porttitor", "sodales", "pellentesque", "augue", "purus"}; 

    @Override 
    public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    setLayoutManager(new LinearLayoutManager(this)); 
    setAdapter(new IconicAdapter()); 
    } 

    class IconicAdapter extends RecyclerView.Adapter<RowHolder> { 
    @Override 
    public RowHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return(new RowHolder(getLayoutInflater() 
          .inflate(R.layout.row, parent, false))); 
    } 

    @Override 
    public void onBindViewHolder(RowHolder holder, int position) { 
     holder.bindModel(items[position]); 
    } 

    @Override 
    public int getItemCount() { 
     return(items.length); 
    } 
    } 

    static class RowHolder extends RecyclerView.ViewHolder { 
    TextView label=null; 
    TextView size=null; 
    ImageView icon=null; 
    String template=null; 

    RowHolder(View row) { 
     super(row); 

     label=(TextView)row.findViewById(R.id.label); 
     size=(TextView)row.findViewById(R.id.size); 
     icon=(ImageView)row.findViewById(R.id.icon); 

     template=size.getContext().getString(R.string.size_template); 
    } 

    void bindModel(String item) { 
     label.setText(item); 
     size.setText(String.format(template, item.length())); 

     if (item.length()>4) { 
     icon.setImageResource(R.drawable.delete); 
     } 
     else { 
     icon.setImageResource(R.drawable.ok); 
     } 
    } 
    } 
} 

這擴展a simple RecyclerViewActivity我拼湊起來的對口ListActivity,但大部分的邏輯是在這裏,在AdapterViewHolder。如果需要,您還可以全面查看the full project~20 RecyclerView sample projects

相關問題