2

Я работаю с макетом вкладок. Я получаю данные из живой БД, чтобы показать информацию в списке. Для этого я использую CustomAdapter. Значение, которое в arraylist получает правильно. После того, как данные Arraylist переданы в CustomAdapter, Context получит исключение null. Как передать контекст фрагмента в пользовательский адаптер.Пользовательский адаптер получает нулевой контекст из фрагмента

Пользовательский адаптер Конструктор

/**Here in Constructor, context getting null value. App Crashing*/ 
public HotelCustomAdapter(Context hotelMaster, int textViewResourceId,ArrayList<GetSetOffers> hotelLists) { 
    super(hotelMaster,textViewResourceId, hotelLists); 
    hotelList=hotelLists; 
    context=hotelMaster; 
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

Отредактировано:

Фрагмент

Из фрагмента я звоню класс AsyncTask, чтобы получить данные из облака. Из postExecute я передаю Arraylist методу фрагмента. В этом случае контекст имеет значение null. Как это исправить.

Фрагмент класса

метод
public class OneFragment extends Fragment implements View.OnClickListener{ 
View view; 
Button ok; 
TextView text; 
public ListView list; 
HotelCustomAdapter hca; 
ArrayList<GetSetOffers> temp; 
Context context; 
public OneFragment() { 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    ScrollView scroller = new ScrollView(getActivity()); 

    view = inflater.inflate(R.layout.fragment_one, container, false); 
    ok = (Button) view.findViewById(R.id.ok); 
    text = (TextView)view.findViewById(R.id.text); 
    list = (ListView) view.findViewById(R.id.list); 
    ok.setOnClickListener(this); 
    context=view.getContext(); // Here the context is assigned 
    new AsyncHotel(getActivity()).execute("19"); 
    return view; 
} 

//After the value got from postExecute, it was showing null to the context 
public void getAdapterView(ArrayList<GetSetOffers> hotelList){ 
    //temp=hotelList; 
    hca=new HotelCustomAdapter(context,R.layout.hotel_custom_listview,hotelList); 
    list.setAdapter(hca); 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.ok: 
      text.setText("Y You Clicked.?"); 
    //hca=new HotelCustomAdapter(getActivity(),R.layout.hotel_custom_listview,temp); 
    //list.setAdapter(hca);  // tried this 
      break; 
    } 
} 

} 

postExecute()

@Override 
protected void onPostExecute(String result) { 
    try { 
     root = new JSONObject(result); 
     validation = root.getInt("response"); 
     JSONArray data = root.getJSONArray("data"); 

     if (validation == 1) { 
      for (int i = 0; i < data.length(); i++) { 
       hgs = new GetSetOffers(); 
       hgs.setOfferTitle(data.getJSONObject(i).getString("hotel_name")); 
       hgs.setOfferDescrip(data.getJSONObject(i).getString("city")); 
       hgs.setOfferToDt(data.getJSONObject(i).getString("hotel_name")); 

       hotelList.add(hgs); 
      } 
      OneFragment one=new OneFragment(); // I think here I am doing wrong 
      one.getAdapterView(hotelList); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

Я думаю Передача значения из метода AsyncTask postExecute дробиться неправильно. Опять же, контекст фрагмента равен нулю.

Контекст объявлен глобально. Перед вызовом класса AsyncTask переменной контекста присваивается Activity. Этот контекст Фрагмента имеет значение сейчас. Класс AsyncTask завершает свою задачу, а затем список передается фрагменту, создавая новый объект для этого фрагмента в методе postExecute() и перед передачей этого списка в Custom Array Adapter, а контекст имеет значение null. См. Изображение.

enter image description here

Я снова попытался присвоить, что получил список глобальных переменных в фрагменте. Затем после нажатия кнопки я попытался передать список в Custom Array Adapter. Теперь контекст значение и список измененных изменился опустошить даже этот список присваивается глобальной переменной

+0

Создайте глобальную переменную контекста, присвойте view.getContext() этому в своем onCreateView(), а затем используйте его везде. –

+0

Спасибо @Nick Isaacs, Извините за поздний ответ.Внутри переменной контекста onCreateView() значение null. Контекст = view.getContext(); –

ответ

0

Наконец я объединил два класса. Класс AsyncTask и фрагмент. Итак, теперь контекст не является нулевым. Внутри фрагмента я закодировал AsyncTask. Итак, теперь передаем значения в Adapter, получая контекст должным образом. Теперь приложение работает правильно. Не сбой.

Thanks @Shoeb Siddique. Наш чат-разговор дает некоторые идеи.

2

Из-за проблем, как я начал делать это:

 @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); 
      ... 
     } 
+0

Спасибо @kris larson. Внутри конструктора класса Custom Adapter получает значение null для контекста. Затем, как будет вызван метод getView(). –

+0

Отредактированный вопрос, пожалуйста, проверьте один раз. Контракт фрагмента равен null, передавая список классу фрагментов. –

1

Пожалуйста, попробуйте это -

//After the value got from postExecute, it was showing null to the context 
public void getAdapterView(ArrayList<GetSetOffers> hotelList){ 
    hca=new HotelCustomAdapter(getActivity(),R.layout.hotel_custom_listview,hotelList); 
    list.setAdapter(hca); 
} 

А также сделайте это в классе адаптера.

/**Here in Constructor, context getting null value. App Crashing*/ 
Activity context; 
public HotelCustomAdapter(Activity hotelMaster, int textViewResourceId,ArrayList<GetSetOffers> hotelLists) { 
    super(hotelMaster,textViewResourceId, hotelLists); 
    hotelList=hotelLists; 
    this.context=hotelMaster; 
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 
+0

Спасибо. См. Изображения выше. Я попробовал ваш код. Мой код также показывает тот же нуль в контексте перед тем, как перейти к адаптеру пользовательского массива –

+0

Да, ваш контекст Fragment показывает нуль, но можете ли вы проверить контекст в адаптере? –

+0

Да как же. Пропускаю null, In Adapter также null –

1
//After the value got from postExecute, it was showing null to the context 
public void getAdapterView(ArrayList<GetSetOffers> hotelList){ 
    hca=new HotelCustomAdapter(getActivity(),R.layout.hotel_custom_listview,hotelList); 
    list.setAdapter(hca); 
} 

ли только это изменение. Не нужно изменять контекст в адаптере. Это будет работать.

+0

Спасибо. См. Изображения выше. Я попробовал ваш код. Тот же нуль в контексте –

Смежные вопросы