Попробуйте выполнить рефакторинг адаптера с помощью BaseAdapter
, следуя
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class ShipmentsAdaptor extends BaseAdapter {
private RealmResults<Shipment> dataSet;
private Context mContext;
// View lookup cache
private static class ViewHolder {
TextView stockItemId;
TextView technicianName;
TextView shipmentDate;
}
public ShipmentsAdaptor(RealmResults<Shipment> dataSet, Context context) {
this.dataSet = dataSet;
this.mContext = context;
}
@Override
public int getCount() {
return dataSet.size();
}
@Override
public Object getItem(int position) {
return dataSet.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
Shipment shipment = (Shipment) getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(R.layout.shipments_out_row_item, parent, false);
viewHolder.stockItemId = convertView.findViewById(R.id.stockItemId);
viewHolder.technicianName = convertView.findViewById(R.id.technicianName);
viewHolder.shipmentDate = convertView.findViewById(R.id.shipmentDate);
result = convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result=convertView;
}
lastPosition = position; //use getItemId() instead
if(shipment != null){
viewHolder.stockItemId.setText(String.valueOf(shipment.id));
if(shipment.technician != null){
viewHolder.technicianName.setText(shipment.technician.name);
}
viewHolder.shipmentDate.setText(shipment.shippingDate);
}
// Return the completed view to render on screen
return convertView;
}
}
Fragment#getContext()
имеет значение NULL. Этот метод возвращает null
, когда ваш фрагмент отключен от активности. Приложение вылетает из-за того, что вы создаете адаптер, пока фрагмент не прикреплен, что приводит к null
, переданному конструктору.
Метод showShipments
должен вызываться только тогда, когда фрагмент прикреплен к действию , Существуют обратные вызовы onAttach()
и onDetach()
, которые помогут вам обнаружить состояние. Также isAdded()
возвращает вам логическое высказывание, если фрагмент присоединен или нет. Выберите то, что вам удобно.
Удачи!
Похоже, вы вызываете fetchShipments();
до того, как будет отображено представление макета фрагмента (myView), поэтому оно равно null, когда создается экземпляр адаптера.
Попробуйте:
Переместите fetchShipments();
из onCreateView () и поместите его в onResume () или переопределите onStart () и вызовите его там
Вы можете проверить значение null во время настройки адаптера, чтобы этого избежать. В фрагменте getActivity
может иногда возвращать null в разных точках в течение жизненного цикла фрагмента . Например, в showShipments
Activity a = getActivity();
if( a == null || a.isFinishing() ) {
// Not in a valid state to show things anyway, so just stop and exit
return;
}
ShipmentsAdaptor adaptor = new ShipmentsAdaptor(savedShipments, a);
Вы также можете проверить isAdded()
, и если это ложь, вы можете получить значение null из getActivity()
.
Также рассмотрите перемещение вызов fetchShipments()
из onCreateView
в onActivityCreated
.