我正在使用Tab Layout。我从实时数据库中获取数据以在listview中显示信息。为此,我使用CustomAdapter。 arraylist中正确的值。一旦您传递给CustomAdapter的Arraylist数据,然后Context获得null异常。如何将Fragment的上下文传递给自定义适配器。
自定义适配器构造函数
/**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传递给片段方法。此时上下文为空。如何解决这个问题。
片段类
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方法的值传递给Fragment是错误的。片段上下文再次为空。
上下文是全局声明的。在调用AsyncTask类之前,将使用Activity分配上下文变量。 Fragment上下文现在有价值。 AsyncTask类完成其任务,然后通过在postExecute()方法中为该片段创建新对象,并在将该列表传递给Custom Array Adapter并且上下文为null之前,将列表传递给片段。请看图片。
我再次尝试将收到的列表分配给Fragment中的全局变量。然后在按钮单击后我尝试将列表传递给Custom Array Adapter。现在上下文具有值,并且列表更改已更改为空,即使该列表已分配给全局变量
答案 0 :(得分:2)
由于我开始这样做的问题:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
...
}
答案 1 :(得分: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);
}
并在Adapter类中执行此操作。
/**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);
}
答案 2 :(得分:1)
UIScrollViewDelegate
只做这个改变。无需更改适配器中的Context。它会起作用。
答案 3 :(得分:0)
最后我合并了这两个类。 AsyncTask类和Fragment。所以,现在上下文不是null。在片段里面我编写了AsyncTask。所以现在将值传递给Adapter正确获取上下文。现在应用程序正常工作。没有崩溃。
谢谢@Shoeb Siddique。我们的聊天对话给出了一些想法。