当前位置: 首页 > 知识库问答 >
问题:

自定义适配器从片段获取空上下文

濮俭
2023-03-14

我正在使用选项卡布局。我正在从live DB获取数据,以便在listview中显示信息。为此,我使用CustomAdapter。arraylist中正确获取的值。一旦将Arraylist数据传递给CustomAdapter,则上下文将出现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传递给fragment方法。此时,上下文为空。如何修复此问题。

片段类

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是错误的。片段上下文再次为null。

上下文是全局声明的。在调用AsyncTask类之前,上下文变量被分配给Active。该片段上下文现在有值。AsyncTask类完成其任务,然后将列表传递给片段,方法是在postExecute()方法中为该片段创建新对象,然后将该列表传递给自定义数组适配器,并且上下文为空。请参阅图像。

我再次尝试将收到的列表分配给片段中的全局变量。然后单击按钮后,我尝试将列表传递给自定义阵列适配器。现在,上下文具有值,列表更改为空,即使该列表已分配给全局变量

共有3个答案

薛宇
2023-03-14
//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);
} 

仅执行此更改。无需更改适配器中的上下文。它会起作用的。

梁学真
2023-03-14

请试试这个-

//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); 
} 
茅慈
2023-03-14

因为这样的问题,我开始这样做:

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
           View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
           ...
        }
 类似资料:
  • 我正在尝试将ListView与fragmnet中的自定义适配器(baseAdapter)一起使用。 当我直接在MainActivity中使用此代码时,一切正常,但当我在片段中使用此代码时,它没有崩溃,但它没有显示任何内容,它只是一个空白片段。另外,当我尝试使用简单的arrayAdapter在片段中绑定一个textView时,它工作得很好,所以我认为问题将出现在我的自定义适配器中。 为什么不显示Li

  • 问题内容: 这个想法是我有一个列表视图,其中每个项目都是一个产品,当我单击该项目时,我需要从列表视图的适配器内部的单击中转到另一个片段。 我的适配器是: 您必须假设所有代码都在工作。 如何转到适配器内的产品Fragment? 问题答案: 为了解决这个问题,我要做的是: 在主类中,我将参数作为值,并通过开关在我感兴趣的main中设置了片段。

  • 在适配器中 Holder.NameExam2.SetOnClickListener(新建View.OnClickListener(){ 成碎片 @覆盖公共视图onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ 它在getString()中调用空指针异常。如何解决。

  • 英文原文:http://emberjs.com/guides/models/customizing-adapters/ 在Ember Data中,处理与后台数据仓库通信的逻辑是通过Adapter来完成的。Ember Data适配器内置了一些关于REST API的假定。如果后台的实现与Ember Data假定的惯例不同,那么通过扩展缺省的适配器可能很容易的实现。 有时因为一些原因需要自定义适配器,例

  • Ember.js适配器指定如何在后端数据存储中保存数据,例如URL格式和REST API标头。 默认的Ember适配器包含一些REST API的内置假设。 这些假设有助于更轻松,更好地构建Web应用程序。 可以使用以下命令创建适配器 - ember generate adapter adapter-name 运行上面的命令时,它将显示以下行 - import DS from 'ember-dat

  • 我使用的是Liferay 6.1 CE版本。我在控制面板的用户实体中添加了自定义属性。我想在create_account中添加这个自定义字段。jsp钩子页。我是这样加的。 之后,我尝试在UserLocalService钩子类中获取这个值,该类扩展了UserLocalServiceWrapper类-(钩子)。我从中找到每个值,但无法获得自定义字段值。 我正试图获得这样的自定义字段值。 但我得到的是空