爲什麼在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
,但大部分的邏輯是在這裏,在Adapter
和ViewHolder
。如果需要,您還可以全面查看the full project和~20 RecyclerView
sample projects。