контекстная нулевая проблема

-1
задан Kling Klang 13 July 2018 в 15:30
поделиться

4 ответа

Попробуйте выполнить рефакторинг адаптера с помощью 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;
    }
}
0
ответ дан Abner Escócio 17 August 2018 в 12:40
поделиться

Fragment#getContext() имеет значение NULL. Этот метод возвращает null, когда ваш фрагмент отключен от активности. Приложение вылетает из-за того, что вы создаете адаптер, пока фрагмент не прикреплен, что приводит к null, переданному конструктору.

Метод showShipments должен вызываться только тогда, когда фрагмент прикреплен к действию , Существуют обратные вызовы onAttach() и onDetach(), которые помогут вам обнаружить состояние. Также isAdded() возвращает вам логическое высказывание, если фрагмент присоединен или нет. Выберите то, что вам удобно.

Удачи!

1
ответ дан Gennadii Saprykin 17 August 2018 в 12:40
поделиться
  • 1
    Спасибо, имеет большой смысл, будет использовать приведенный выше код, чтобы узнать, работает ли это – Lewis Smith 13 July 2018 в 14:13
  • 2
    onAttach, похоже, не является методом, который может переопределить фрагмент, я делаю это не в том месте – Lewis Smith 13 July 2018 в 14:19
  • 3
    [Д0] developer.android.com/reference/android/app/… – Gennadii Saprykin 13 July 2018 в 14:21
  • 4
    Я добавил полную ошибку, если это помогает – Lewis Smith 13 July 2018 в 14:24
  • 5
    Это никак не меняет мой ответ :) Но спасибо за добавление дополнительной информации. Решение прост - просто убедитесь, что контекст, который вы передаете адаптеру, никогда не является нулевым. – Gennadii Saprykin 13 July 2018 в 14:37

Похоже, вы вызываете fetchShipments(); до того, как будет отображено представление макета фрагмента (myView), поэтому оно равно null, когда создается экземпляр адаптера.

Попробуйте:

Переместите fetchShipments(); из onCreateView () и поместите его в onResume () или переопределите onStart () и вызовите его там

0
ответ дан Ten 17 August 2018 в 12:40
поделиться

Вы можете проверить значение 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.

0
ответ дан Tyler V 17 August 2018 в 12:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: