2014-02-15 74 views
3

我目前有3个片段,但我无法让我的适配器工作。 当我调用lv.setAdapter(lbadapter)时,它返回一个空指针异常。 可能是什么问题?Listview设置适配器片段nullpointerexception

在此先感谢

这里是我的片段的一部分:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView; 
    rootView = inflater.inflate(R.layout.leadlist, container, false); 



    profielen = new ArrayList<Profile>(); 
    new getLeaderboards().execute(url); 

    lv = (ListView) this.getActivity().findViewById(android.R.id.list); 
    lbadapter = new LeaderBoardAdapter(this.getActivity(), R.layout.item_layout, profielen); 


    return rootView; 
} 

public static class getLeaderboards extends AsyncTask<String, Void, JsonObject> { 


    @Override 
    protected JsonObject doInBackground(String... urls) { 

     JsonObject x = parseURL.GetJSON(urls[0]); 

     return x; 
    } 


    @Override 
    protected void onPostExecute(JsonObject obj) { 
     Gson gson = new Gson(); 
     JsonArray arr = obj.get("rows").getAsJsonArray(); 

     for (JsonElement el : arr) { 
      Profile pat = gson.fromJson(el , Profile.class); 
      profielen.add(pat); 
     } 

     lv.setAdapter(lbadapter); 


    } 

} 

这是我的leadlist.xml文件:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_centerInParent="true" 
    android:divider="@null" 
    android:dividerHeight="20dp" > 
</ListView> 


</RelativeLayout> 

我的适配器:

public class LeaderBoardAdapter extends ArrayAdapter<Profile>{ 

LayoutInflater vi; 
List<Profile> profielen; 
Context mContext; 
int res; 
public LeaderBoardAdapter(Context context, int resource, 
     List<Profile> objects) { 
    super(context, resource, objects); 
    this.res = resource; 
    this.profielen = objects; 
    mContext = context; 
    vi = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 


    ProfileHolder holder = null; 
    if(convertView == null) 
    { 
     LayoutInflater inflater = ((Activity)mContext).getLayoutInflater(); 
     convertView = vi.inflate(R.layout.item_layout, parent, false); 
     convertView = inflater.inflate(res, parent, false); 

     holder = new ProfileHolder(); 
     holder.name = (TextView)convertView.findViewById(R.id.nameChar); 
     holder.pic = (ImageView)convertView.findViewById(R.id.imageChar); 
     holder.rank = (TextView)convertView.findViewById(R.id.ratingNumber); 

     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ProfileHolder)convertView.getTag(); 
    } 

    Profile p = profielen.get(position); 
    holder.name.setText(p.getName()); 
    holder.rank.setText(p.getRanking()); 

    return convertView; 

} 

public static class ProfileHolder{ 
    TextView name; 
    ImageView pic; 
    TextView rank; 
} 





} 
+0

尝试初始化ListView后启动AsyncTask –

+0

可以任何帮助http://stackoverflow.com/questions/28148618/listview-not-refreshing-after-click-on-button – 2015-01-27 13:23:39

回答

8
lv = (ListView) this.getActivity().findViewById(android.R.id.list); 

反而这样做。由于列表视图与您的Activity没有直接关系。这是片段内封闭的视图,其持有的ListView

lv = (ListView) rootView.findViewById(android.R.id.list); 
+0

感谢它的工作原理。顺便说一下另一个问题,你是否需要为每个片段分别设计一个布局,还是一个布局足够了? – David

+0

这是基于你需要在片段内显示的内容。 – Triode

+0

如果你需要在每个片段上使用相同的用户界面,那么你就可以正常工作。 –

1

可能是你需要做这样的

lv = (ListView) rootView.findViewById(android.R.id.list); 

,而不是

lv = (ListView) this.getActivity().findViewById(android.R.id.list); 

假设列表视图中片段。

+1

该答案已由我发布。 – Triode

+0

@RajeshCP是的,可能我们在哪里做同一时间... –

+0

如果你看一看时差,你可以缩小这个范围。 – Triode

0

问题在于你初始化ListView的方式。如果您发现它属于您的leadlist.xml文件。但是在初始化你打电话,

lv = (ListView) this.getActivity().findViewById(android.R.id.list); // this means your listView lv belongs to your MainActivity which actually doesn't. 

更改为,

lv = (ListView) rootView.findViewById(android.R.id.list); 

,它应该工作。让我知道它是怎么回事。快乐编码:)

相关问题