我正在研究Android回收视图,我发现了这个例子
回收器适配器
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private String[] titles = {"Capter One",
"Chapter Two",
"Chapter Three",
"Chapter Four",
"Chapter Five",
"Chapter Six"
};
private String[] details = {"Det..One","Det..Two","Det.. Three","Det...Four","Det.. Five","Det..Six"};
private int[] images = {R.drawable.android_image_1,
R.drawable.android_image_2,
R.drawable.android_image_3,
R.drawable.android_image_4,
R.drawable.android_image_5,
R.drawable.android_image_6
};
@Override
public ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i ){
View v = LayoutInflater.from (viewGroup.getContext ()).inflate (R.layout.card_layout, viewGroup,false);
ViewHolder viewHolder = new ViewHolder (v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.itemTitle.setText(titles[i]);
viewHolder.itemDetail.setText(details[i]);
viewHolder.itemImage.setImageResource(images[i]);
}
@Override
public int getItemCount() {
return titles.length;
}
class ViewHolder extends RecyclerView.ViewHolder /*implements Inter*/{
ImageView itemImage;
TextView itemTitle;
TextView itemDetail;
ViewHolder( View itemView ){
super(itemView);
itemImage = itemView.findViewById (R.id.item_image);
itemTitle = itemView.findViewById (R.id.item_title);
itemDetail = itemView.findViewById (R.id.item_detail);
itemView.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick ( View v ) {
int position = getAdapterPosition ();
position +=1;
Snackbar.make (v,"click on position" + titles[position],Snackbar.LENGTH_SHORT).setAction ("Action", null).show ();
}
});
}
}
}
Mainactivity.java:
public class MainActivity extends AppCompatActivity {
RecyclerView recycledView;
RecyclerView.LayoutManager layoutManager;
RecyclerView.Adapter adapter;
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
Toolbar toolbar = findViewById (R.id.toolbar);
setSupportActionBar (toolbar);
recycledView = findViewById (R.id.recycle_View);
layoutManager = new LinearLayoutManager (this);
recycledView.setLayoutManager (layoutManager);
adapter = new RecyclerAdapter ();
recycledView.setAdapter (adapter);
}
没什么特别的,而且效果很好。 我只是做了一点“最佳实践”的改动。 我想从这样的资源文件中获取标题数组:
<resources>
<string-array name="titles">
<item>Chap 1</item>
<item>Chap 2</item>
<item>Chap 3</item>
<item>Chap 4</item>
<item>Chap 5</item>
<item>Chap 6</item>
<item>Chap 7</item>
<item>Chap 8</item>
</string-array>
</resources>
所以我做了一些代码调整。。。 声明标题数组
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
**private String[] titles;**
我在onCreateViewHolder方法中链接资源
View v = LayoutInflater.from (viewGroup.getContext ()).inflate (R.layout.index_layout, viewGroup,false);
ViewHolder viewHolder = new ViewHolder (v);
**Resources res = v.getResources ();
titles=res.getStringArray (R.array.chapters);**
return viewHolder;
但是当我运行应用程序时,我得到java.lang.NullPointerException:尝试在com.example.evenbook.recycleradapter.getItemCount(recycleradapter.java:55)中得到空数组的长度
中的数组为null
public int getItemCount() {
return titles.length;
}
如果我尝试返回5,它是可以的(它只显示5卡项目)。
我还认为getItemCount方法在onCreateViewHolder之前就开始了,但我认为这是不可能的。 怎么了? 提前致谢
尝试以下更改:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private String[] titles;
private String[] details;
private int[] images;
public RecyclerAdapter() {
this.titles = = {"Capter One",
"Chapter Two",
"Chapter Three",
"Chapter Four",
"Chapter Five",
"Chapter Six"
};
this.details = = {"Det..One","Det..Two","Det.. Three","Det...Four","Det.. Five","Det..Six"};
this.images = = {R.drawable.android_image_1,
R.drawable.android_image_2,
R.drawable.android_image_3,
R.drawable.android_image_4,
R.drawable.android_image_5,
R.drawable.android_image_6
};
}
@Override
public ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i ){
View v = LayoutInflater.from (viewGroup.getContext ()).inflate (R.layout.card_layout, viewGroup,false);
ViewHolder viewHolder = new ViewHolder (v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.itemTitle.setText(titles[i]);
viewHolder.itemDetail.setText(details[i]);
viewHolder.itemImage.setImageResource(images[i]);
}
@Override
public int getItemCount() {
return titles.length;
}
class ViewHolder extends RecyclerView.ViewHolder /*implements Inter*/{
ImageView itemImage;
TextView itemTitle;
TextView itemDetail;
ViewHolder( View itemView ){
super(itemView);
itemImage = itemView.findViewById (R.id.item_image);
itemTitle = itemView.findViewById (R.id.item_title);
itemDetail = itemView.findViewById (R.id.item_detail);
itemView.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick ( View v ) {
int position = getAdapterPosition ();
position +=1;
Snackbar.make (v,"click on position" + titles[position],Snackbar.LENGTH_SHORT).setAction ("Action", null).show ();
}
});
}
}
}
您可以使用getResources().getStringArray
从资源中获取数组
String[] array = getResources().getStringArray(R.array.titles);
然后您可以更改适配器构造函数以接受列表
RecyclerAdapter adapter = new RecyclerAdapter(array);
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private String[] titles;
RecyclerAdapter(String[] titles) {
this.titles = titles;
}
// ... rest of class
}