android - 带有 CustomListAdapter 和 Volley 的 Fragment ViewPager?

标签 android android-fragments android-volley fragmentpageradapter listview-adapter

我需要扩展 ActionBarActivitypublic class FragmentB。它没有错误,但是当我尝试在适配器中调用它时。

FragmentPagerAdapter 代码:

public class FragmentPagerAdapter extends android.support.v4.app.FragmentPagerAdapter{

    private static int NUM_ITEMS = 3;
    public FragmentPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    // Returns total number of pages
    @Override
    public int getCount() {
        return NUM_ITEMS;
    }
    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                FragmentA a = new FragmentA();
                return a;
            case 1:
                FragmentB b = new FragmentB();
                return b;
            case 2:
                FragmentC c = new FragmentC();
                return c;
            default:
                return null;
        }
    }

    // Returns the page title for the top indicator
    @Override
    public CharSequence getPageTitle(int position) {
        return "Page " + position;
    }
}

它说我需要一个在 return b 处扩展 android.support.v4.app.Fragment 的类。在 Fragment A 和 C 中没有 ActionBarActivity 的实现,这就是没有错误的原因,而在 return b 中有错误。

基本上,我需要在 fragment B 上显示所有事件。如果我在没有 fragment 的情况下测试它,它会工作,但有了它们就会变成一个小问题。由于用于滑动的 ViewPager,我需要这些 fragment 。

fragment B代码:

private static final String TAG = FragmentB.class.getSimpleName();

private static final String url = "http://server.si/events.php";
private ProgressDialog pDialog;
private List<Event> eventList = new ArrayList<Event>();
private ListView listView;
private CustomListAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    adapter = new CustomListAdapter(getActivity(), eventList);
}

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

    ListView listView = (ListView) rootView.findViewById(R.id.list);
    listView.setAdapter(adapter);

    pDialog.setMessage("Loading Events...");
    pDialog.show();

    JsonArrayRequest eventReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    hidePDialog();

                    for (int i = 0; i < response.length(); i++) {
                        try {
                            JSONObject obj = response.getJSONObject(i);
                            Event event = new Event();
                            event.setTitle(obj.getString("name"));
                            event.setPicture_url(obj.getString("picture_url"));
                            event.setCity(obj.getString("city"));
                            event.setDate(obj.getString("date"));

                            eventList.add(event);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }

                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data
                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    hidePDialog();

                }
    });

    AppController.getInstance().addToRequestQueue(eventReq);

    return rootView;
}

@Override
public void onDestroy() {
    super.onDestroy();
    hidePDialog();
}

private void hidePDialog() {
    if (pDialog != null) {
        pDialog.dismiss();
        pDialog = null;
    }
}

自定义列表适配器代码: 公共(public)类 CustomListAdapter 扩展 BaseAdapter { 私有(private) Activity Activity ; 私有(private) LayoutInflater 充气机; 私有(private)列表事件项; ImageLoader imageLoader = AppController.getInstance().getImageLoader(); public CustomListAdapter(Activity activity, List eventItems) { this.activity = Activity ; this.eventItems = eventItems;

    @Override
    public int getCount() {
        return eventItems.size();
    }

    @Override
    public Object getItem(int location) {
        return eventItems.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.list_row, null);

        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();
        NetworkImageView thumbNail = (NetworkImageView) convertView
                .findViewById(R.id.picture);
        TextView name = (TextView) convertView.findViewById(R.id.name);
        TextView city = (TextView) convertView.findViewById(R.id.city);
        TextView date = (TextView) convertView.findViewById(R.id.date);

        Event m = eventItems.get(position);

        thumbNail.setImageUrl(m.getPicture_url(), imageLoader);

        name.setText(m.getTitle());

        city.setText("City: " + String.valueOf(m.getCity()));

        date.setText(String.valueOf(m.getDate()));

        return convertView;
    }

这是运行时的错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'com.android.volley.toolbox.ImageLoader teamtwo.event.com.events.Events.AppController.getImageLoader()' on a null object reference
            at teamtwo.event.com.events.Events.CustomListAdapter.<init>(CustomListAdapter.java:27)
            at teamtwo.event.com.events.FragmentB.onCreate(FragmentB.java:50)

看起来,我在 OnCreate 方法上做错了什么。我不知道我应该把代码放在哪里。OnCreate 是在一切膨胀或创建 Activity 和 fragment 之前,而 OnCreateView 设置 fragment 布局。我不知道该怎么办。

最佳答案

将此行添加到 AndroidManifest.xml 中的 application 标记 MyApplication 项目中的文件:

android:name="primoz.test.com.volleytesting.AppController"

如果您在应用程序 list 中错过了这一行,那么每次调用时 AppController.getInstance() 都将为 null。

关于android - 带有 CustomListAdapter 和 Volley 的 Fragment ViewPager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29340118/

相关文章:

Android导航组件不显示 fragment

Android AppcompatActivity 与 fragment 从后台调用后崩溃(需要等待几分钟)

android - 如何在 Volley 中设置用户代理?

java - 将 ArrayList 放入参数 JsonObject

android - 支持被新方法取代的已弃用方法的最佳方法是什么?

android - 无法解析 setLatestEventInfo 我使用的 sdk 版本是 23

javax 认证失败

android - Android UI 模型的大小?

android - Volley 库是否按顺序处理所有请求

android - Activity 和 FragmentActivity 的区别