2017-07-01 69 views
-2
alPlayerRoles.addAll(responseModel.getData().prModel); 
playerAdapter = new PlayerDetailsAdapter(PlayerDetailsActivity.this, alPlayerRoles); 
lvPlayerRoles.setAdapter(playerAdapter); 

這是我的主線程的代碼,我使用初始化適配器和由我創建了一個模型添加包含對象的ArrayList把它放在一個ListView 。顯示java.lang.NullPointerException Adapter.getView錯誤

alPlayerRoles是作爲數據傳遞給適配器初始化的ArrayList,它具有所有正確的值。用調試器檢查它。

這裏就是整個適配器類太:

private Activity activity; 
public ArrayList<PlayerRolesModel> playerDetails = new ArrayList<>(); 
Context context; 
private LayoutInflater mInflater; 

public PlayerDetailsAdapter(Activity activity, ArrayList<PlayerRolesModel> playerDetails) { 
    super(activity, 0, playerDetails); 
    this.playerDetails = playerDetails; 
    this.activity = activity; 
} 

@Override 
public PlayerRolesModel getItem(int position) { 
    return playerDetails.get(position); 
} 



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

    ViewHolder vh; 

    if (convertView == null) { 
     View view = mInflater.inflate(R.layout.player_details_row, parent, false); 
     vh = ViewHolder.create((RelativeLayout) view); 
     view.setTag(vh); 
    } else { 
     vh = (ViewHolder) convertView.getTag(); 
    } 

    PlayerRolesModel item = getItem(position); 
    PlayerRolesModelTeam team = item.prmTeam; 

    vh.tvRoleSeason.setText(item.startDate.substring(0,3) + "-" + item.endDate.substring(0,3)); 
    vh.tvRoleTeam.setText(team.prmTeamName); 
    vh.tvRoleContractType.setText(item.Type); 
    vh.ivTeamLogoImage.setImageResource(R.drawable.ic_launcher); 
    return vh.rootView; 
} 

private static class ViewHolder { 
    public final RelativeLayout rootView; 
    public final TextView tvRoleSeason; 
    public final TextView tvRoleTeam; 
    public final TextView tvRoleContractType; 
    public final ImageView ivTeamLogoImage; 

    private ViewHolder(RelativeLayout rootView, TextView tvRoleSeason, TextView tvRoleTeam, TextView tvRoleContractType, ImageView ivTeamLogoImage) { 
     this.rootView = rootView; 
     this.tvRoleSeason = tvRoleSeason; 
     this.tvRoleTeam =tvRoleTeam; 
     this.tvRoleContractType = tvRoleContractType; 
     this.ivTeamLogoImage = ivTeamLogoImage; 
    } 

    public static ViewHolder create(RelativeLayout rootView) { 
     TextView tvRoleSeason = (TextView) rootView.findViewById(R.id.tvRoleSeason); 
     TextView tvRoleTeam = (TextView) rootView.findViewById(R.id.tvRoleTeam); 
     TextView tvRoleContractType = (TextView) rootView.findViewById(R.id.tvRoleContractType); 
     ImageView ivTeamLogoImage = (ImageView) rootView.findViewById(R.id.ivTeamLogoImage); 
     return new ViewHolder(rootView, tvRoleSeason, tvRoleTeam, tvRoleContractType, ivTeamLogoImage); 
    } 
} 

我之前已經多次使用了相同的模板適配器,它總是工作,沒有什麼問題,但是這一次我發現了上面提到的錯誤。這是否意味着數據以某種方式作爲空ArrayList傳遞,或者其他東西沒有正確初始化?

編輯:堆棧跟蹤

FATAL EXCEPTION: main 
Process: bahisadam.com.bahisadam, PID: 21210 
java.lang.NullPointerException 
    at com.bahisadam.view.PlayerDetailsActivity$1.onResponse(PlayerDetailsActivity.java:155) 
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5124) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:613) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

你應該a)添加堆棧跟蹤和b)確切地告訴你在哪一行出現錯誤。 – SJuan76

+0

嘗試在getView'View view = convertView'然後if(view == null){'then'view = mInflater ....'和'view.getTag()'也返回'view' – Raghunandan

+0

我已經擁有了所有在getView方法中設置 – user1938007

回答

1

從它似乎你將項目添加到它

除此之外變化

之前未初始化列表

allPlayerRoles = new ArrrayList<>(); 

聊天討論

static class ViewHolder { 

TextView tvRoleSeason; 
TextView tvRoleTeam; 
TextView tvRoleContractType; 
ImageView ivTeamLogoImage; 
} 

getView

ViewHolder vh; 
if (convertView == null) { 
    convertView = mInflater.inflate(R.layout.player_details_row, parent, false); 
    vh = new ViewHolder(); 
    vh.tvRoleSeason = (TextView) convertView.findViewById(R.id.tvRoleSeason); 
    vh.tvRoleTeam = (TextView) convertView.findViewById(R.id.tvRoleTeam); 
    vh.tvRoleContractType = (TextView) convertView.findViewById(R.id.tvRoleContractType); 
    vh.ivTeamLogoImage = (ImageView) convertView.findViewById(R.id.ivTeamLogoImage); 
    convertView.setTag(vh); 
    } else { 
    vh = (ViewHolder) convertView.getTag(); 

    } 

    PlayerRolesModel item = getItem(position); 
    PlayerRolesModelTeam team = item.prmTeam; 

    vh.tvRoleSeason.setText(item.startDate.substring(0,3) + "-" + item.endDate.substring(0,3)); 
    vh.tvRoleTeam.setText(team.prmTeamName); 
    vh.tvRoleContractType.setText(item.Type); 
    vh.ivTeamLogoImage.setImageResource(R.drawable.ic_launcher); 
    return convertView; 
    } 

ListView中回收視圖。如果有100個項目,所有100個項目都不保存在內存中。假設你在屏幕上有10個項目,你將擁有它們的內存當你在頂部滾動的行被回收並且該視圖被用於下面的一個新行。

所以使用視圖持有人有幫助。實際上這裏有一個更好的解釋How ListView's recycling mechanism works

除了回收:在滾動ListView期間,您的代碼可能會頻繁地調用findViewById(),這會降低性能。即使適配器返回回收的充氣視圖,您仍然需要查找元素並進行更新。重複使用findViewById()的方法是使用「視圖持有者」設計模式。

所以這個settag和gettag有助於避免laggy卷軸。

提示:使用RecyclerView。學習使用調試器。 NullPointerExceptions的所有原因可以很容易地通過斷點找到。你可以找出哪個對象是空的。

相關問題