Java 片段中初始化为空的ViewHolder字段
我正在尝试使用大量“grid_cell”xml布局在回收器视图中设置gridLayout,每个布局包含5个ImageView。我让recyclerView工作得很好,直到我重新构造代码以适应数据库 问题是MapViewHolder构造函数中的所有ImageView都被初始化为null,导致Java 片段中初始化为空的ViewHolder字段,java,android,android-fragments,Java,Android,Android Fragments,我正在尝试使用大量“grid_cell”xml布局在回收器视图中设置gridLayout,每个布局包含5个ImageView。我让recyclerView工作得很好,直到我重新构造代码以适应数据库 问题是MapViewHolder构造函数中的所有ImageView都被初始化为null,导致java.lang.NullPointerException:尝试在null对象引用上调用虚拟方法'void android.widget.ImageView.setImageResource(int) 公共类
java.lang.NullPointerException:尝试在null对象引用上调用虚拟方法'void android.widget.ImageView.setImageResource(int)
公共类MapFragment扩展了片段
{
私有游戏数据存储游戏数据存储;
私人回收车;
私有映射适配器;
专用GridLayoutManager GridLayoutManager;
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
gameDataStorage=((子应用程序)getActivity().getApplication()).gameDataStorage;
}
@凌驾
创建视图上的公共视图(布局、扁平充气器、视图组父视图、捆绑包)
{
//从fragment_map.xml布局中展开视图。
视图=充气机。充气(R.layout.fragment\u map,父项,false);
//从map_recycler_view.xml布局包装回收器视图
rv=view.findViewById(R.id.map\u recycler\u视图);
adapter=新映射适配器();
//初始化网格布局管理器
gridLayoutManager=新建gridLayoutManager(getActivity(),GameData.getInstance().getSettings().getMapHeight(),gridLayoutManager.HORIZONTAL,false);
//设置回收器视图适配器
rv.设置适配器(适配器);
//将布局管理器设置为水平滚动网格
rv.setLayoutManager(gridLayoutManager);
返回视图;
}
公共类MapViewHolder扩展了RecyclerView.ViewHolder
{
私有图像视图结构;
私有图像视图左上角;
私有图像视图右上角;
私有图像视图左下角;
私权;
公共地图视图持有者(Layoutiner li,视图组父级)
{
super(li.inflate(R.layout.grid_单元格,父单元格,false));
int size=parent.getMeasuredHeight()/GameData.getInstance().getSettings().getMapHeight()+1;
ViewGroup.LayoutParams lp=parent.getLayoutParams();
lp.高度=尺寸;
lp.宽度=尺寸;
structure=(ImageView)parent.findViewById(R.id.structure);
topLeft=(ImageView)parent.findViewById(R.id.top\u left);
topRight=(ImageView)parent.findViewById(R.id.top\u right);
bottomLeft=(ImageView)parent.findViewById(R.id.bottom\u left);
bottomRight=(ImageView)parent.findViewById(R.id.bottom\u right);
//调试
Log.d(“游戏数据”,“结构参考被初始化为”+结构);
Log.d(“游戏数据”,“左上角参考初始化为“+左上角”);
Log.d(“游戏数据”,“右上角参考被初始化为“+右上角”);
Log.d(“游戏数据”,“左下角参考被初始化为“+左下角”);
Log.d(“游戏数据”,“右下角参考被初始化为“+右下角”);
}
公共void绑定(最终MapElement元素,最终int索引)
{
if(element.getStructure()!=null){
setImageResource(element.getStructure().getImageId());
}
其他的
{
if(结构==null)
{
Log.d(“游戏_数据”,“mapElement的结构引用为空”+索引);
}
setImageResource(GameData.getInstance().getEmpty());
}
setImageResource(element.getTopLeft());
setImageResource(element.getTopRight());
setImageResource(element.getBottomLeft());
setImageResource(element.getBottomRight());
structure.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v)
{
int row=索引%GameData.getInstance().getSettings().getMapHeight();
int col=index/GameData.getInstance().getSettings().getMapHeight();
StructureData.setStructureAt(行、列);
gameDataStorage.updateMapElement(元素,元素.getStructure(),索引);
adapter.notifyItemChanged(索引);
}
});
structure.setOnLongClickListener(新视图.OnLongClickListener(){
@凌驾
仅长按公共布尔值(视图v){
返回false;
}
});
}
}
//端部包括(RecyclerViewSampleWilder)
公共类MapAdapter扩展了RecyclerView.Adapter
{
//开始包括(RecycleServiceOnCreateViewHolder)
//创建新视图(由布局管理器调用)
@凌驾
public MapViewHolder onCreateViewHolder(视图组容器,int-viewType)
{
Log.d(“游戏_数据”,“使用ViewGroup“+容器+”和viewType“+视图类型”的新地图视图持有者);
返回新的MapViewHolder(LayoutInflater.from(getActivity()),容器);
}
//END_包括(RecycleServiceOnCreateViewHolder)
//开始包括(RecycleServiceOnBindViewHolder)
//替换视图的内容(由布局管理器调用)
@凌驾
BindViewHolder上的公共无效(MapViewHolder vh,内部索引){
//在此位置从数据集中获取元素并替换视图的内容
//有了这个元素
int row=索引%GameData.getInstance().getSettings().getMapHeight();
int col=index/GameData.getInstance().getSettings().getMapHeight();
MapElement=GameDat
public class MapFragment extends Fragment
{
private GameDataStorage gameDataStorage;
private RecyclerView rv;
private MapAdapter adapter;
private GridLayoutManager gridLayoutManager;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
gameDataStorage = ((SubApplication)getActivity().getApplication()).gameDataStorage;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle bundle)
{
//Inflate the view from fragment_map.xml layout.
View view = inflater.inflate(R.layout.fragment_map, parent, false);
//Crate the recycler view from the map_recycler_view.xml layout
rv = view.findViewById(R.id.map_recycler_view);
adapter = new MapAdapter();
//Initialise the grid layout manager
gridLayoutManager = new GridLayoutManager(getActivity(), GameData.getInstance().getSettings().getMapHeight(), GridLayoutManager.HORIZONTAL, false);
//Set the recycler view adapter
rv.setAdapter(adapter);
//Set the layout manager to be a horizontal scrolling grid
rv.setLayoutManager(gridLayoutManager);
return view;
}
public class MapViewHolder extends RecyclerView.ViewHolder
{
private ImageView structure;
private ImageView topLeft;
private ImageView topRight;
private ImageView bottomLeft;
private ImageView bottomRight;
public MapViewHolder(LayoutInflater li, ViewGroup parent)
{
super(li.inflate(R.layout.grid_cell, parent, false));
int size = parent.getMeasuredHeight() / GameData.getInstance().getSettings().getMapHeight() + 1;
ViewGroup.LayoutParams lp = parent.getLayoutParams();
lp.height = size;
lp.width = size;
structure = (ImageView) parent.findViewById(R.id.structure);
topLeft = (ImageView) parent.findViewById(R.id.top_left);
topRight = (ImageView) parent.findViewById(R.id.top_right);
bottomLeft = (ImageView) parent.findViewById(R.id.bottom_left);
bottomRight = (ImageView) parent.findViewById(R.id.bottom_right);
//DEBUGGING
Log.d("GAME_DATA", "structure reference is initialised as " + structure);
Log.d("GAME_DATA", "topLeft reference is initialised as " + topLeft);
Log.d("GAME_DATA", "topRight reference is initialised as " + topRight);
Log.d("GAME_DATA", "bottomLeft reference is initialised as " + bottomLeft);
Log.d("GAME_DATA", "bottomRight reference is initialised as " + bottomRight);
}
public void bind(final MapElement element, final int index)
{
if(element.getStructure() != null){
structure.setImageResource(element.getStructure().getImageId());
}
else
{
if(structure == null)
{
Log.d("GAME_DATA", "structure reference is null for mapElement " + index);
}
structure.setImageResource(GameData.getInstance().getEmpty());
}
topLeft.setImageResource(element.getTopLeft());
topRight.setImageResource(element.getTopRight());
bottomLeft.setImageResource(element.getBottomLeft());
bottomRight.setImageResource(element.getBottomRight());
structure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
int row = index % GameData.getInstance().getSettings().getMapHeight();
int col = index / GameData.getInstance().getSettings().getMapHeight();
StructureData.setStructureAt(row, col);
gameDataStorage.updateMapElement(element, element.getStructure(), index);
adapter.notifyItemChanged(index);
}
});
structure.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
}
}
// END_INCLUDE(recyclerViewSampleViewHolder)
public class MapAdapter extends RecyclerView.Adapter<MapViewHolder>
{
// BEGIN_INCLUDE(recyclerViewOnCreateViewHolder)
// Create new views (invoked by the layout manager)
@Override
public MapViewHolder onCreateViewHolder(ViewGroup container, int viewType)
{
Log.d("GAME_DATA", "new MapViewHolder using ViewGroup " + container + " and viewType " + viewType);
return new MapViewHolder(LayoutInflater.from(getActivity()), container);
}
// END_INCLUDE(recyclerViewOnCreateViewHolder)
// BEGIN_INCLUDE(recyclerViewOnBindViewHolder)
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(MapViewHolder vh, int index) {
// Get element from your dataset at this position and replace the contents of the view
// with that element
int row = index % GameData.getInstance().getSettings().getMapHeight();
int col = index / GameData.getInstance().getSettings().getMapHeight();
MapElement element = GameData.getInstance().getMapLoc(row, col);
vh.bind(element, index);
}
// END_INCLUDE(recyclerViewOnBindViewHolder)
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
int rows = GameData.getInstance().getMap().length;
int cols = GameData.getInstance().getMap()[0].length;
int length = rows * cols;
Log.d("GAME_DATA", "getItemCount returns: " + length);
return length;
}
}
}
public MapViewHolder(LayoutInflater li, ViewGroup parent)
{
final View = li.inflate(R.layout.grid_cell, parent, false);
super(view);
int size = view.getMeasuredHeight() / GameData.getInstance().getSettings().getMapHeight() + 1;
ViewGroup.LayoutParams lp = view.getLayoutParams();
lp.height = size;
lp.width = size;
structure = (ImageView) view.findViewById(R.id.structure);
topLeft = (ImageView) view.findViewById(R.id.top_left);
topRight = (ImageView) view.findViewById(R.id.top_right);
bottomLeft = (ImageView) view.findViewById(R.id.bottom_left);
bottomRight = (ImageView) view.findViewById(R.id.bottom_right);
//DEBUGGING
Log.d("GAME_DATA", "structure reference is initialised as " + structure);
Log.d("GAME_DATA", "topLeft reference is initialised as " + topLeft);
Log.d("GAME_DATA", "topRight reference is initialised as " + topRight);
Log.d("GAME_DATA", "bottomLeft reference is initialised as " + bottomLeft);
Log.d("GAME_DATA", "bottomRight reference is initialised as " + bottomRight);
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.Holder> {
private final List<Model> list;
RecyclerViewAdapter(List<WorkshopObj> data, EditTextChangeWorkshopListener editTextChangeWorkshopListener) {
list = data;
setHasStableIds(true);
}
@NotNull
@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_workshop_adapter, parent, false));
}
@Override
public void onBindViewHolder(final Holder holder, final int position) {
final WorkshopObj model = list.get(position);
holder.titleWorkshop.setText(model.getTitleText());
holder.requiredWorkshop.setVisibility(model.isRequired() ? View.VISIBLE : View.GONE);
holder.subTitle.setVisibility(model.isMandatory() ? View.VISIBLE : View.GONE);
}
@Override
public int getItemCount() {
return list.size();
}
class Holder extends RecyclerView.ViewHolder {
private final TextView requiredWorkshop;
private final TextView titleWorkshop;
private final TextView subTitle;
private final EditText price;
Holder(View view) {
super(view);
requiredWorkshop = view.findViewById(R.id.required_workshop);
titleWorkshop = view.findViewById(R.id.title_workshop);
subTitle = view.findViewById(R.id.sub_title);
price = view.findViewById(R.id.price);
}
}
}