Я работаю с макетом вкладок. Я получаю данные из живой БД, чтобы показать информацию в списке. Для этого я использую 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. См. Изображение.
Я снова попытался присвоить, что получил список глобальных переменных в фрагменте. Затем после нажатия кнопки я попытался передать список в Custom Array Adapter. Теперь контекст значение и список измененных изменился опустошить даже этот список присваивается глобальной переменной
Создайте глобальную переменную контекста, присвойте view.getContext() этому в своем onCreateView(), а затем используйте его везде. –
Спасибо @Nick Isaacs, Извините за поздний ответ.Внутри переменной контекста onCreateView() значение null. Контекст = view.getContext(); –