自定义适配器从片段

时间:2016-03-08 17:42:32

标签: android android-fragments android-arrayadapter android-context

我正在使用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之前,将列表传递给片段。请看图片。

enter image description here

我再次尝试将收到的列表分配给Fragment中的全局变量。然后在按钮单击后我尝试将列表传递给Custom Array Adapter。现在上下文具有值,并且列表更改已更改为空,即使该列表已分配给全局变量

4 个答案:

答案 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。我们的聊天对话给出了一些想法。