在片段内的RecylcerView中解析JSON数据

时间:2015-11-09 17:53:49

标签: java android json android-fragments

我需要帮助解决问题的逻辑。我已经在这里搜索过讨论类似问题的帖子,但是我还没有成功解决我的问题,所以我不想把它作为重复的帖子。

我正在处理一个应用程序,我在幻灯片选项卡片段中的回收器视图中显示已解析的JSON数据时遇到问题。我的主要活动上有一个滑动标签,共有五个片段,每个标签一个(总共5个标签)。我想要为第三个选项卡做的是显示一个回收器视图,其中包含从服务器检索的已解析JSON数据。我在其他recyclerviews的活动中具有相同的功能,并且它们工作正常。我只是在如何在一个片段中实现这个问题上稍微挣扎。我提供以下代码用于故障排除和调试目的:

以下是 MainActivity.java

的代码
public class MainActivity extends BaseActivity {

private ViewPager mPager;
private SlidingTabLayout mTabs;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // To track statistics around application
    ParseAnalytics.trackAppOpened(getIntent());

    // inform the Parse Cloud that it is ready for notifications
    ParseInstallation.getCurrentInstallation().saveInBackground();

    //Calling Activate Toolbar method
    activateToolBar();

    mPager = (ViewPager) findViewById(R.id.pager);
    //Setting the Adapter on the view pager first. Passing the fragment manager through as an argument
    mPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
    mTabs = (SlidingTabLayout) findViewById(R.id.tabs);

    //Setting the custom Tab View as the Sliding Tabs Layout
    mTabs.setCustomTabView(R.layout.custom_tab_view, R.id.tabText);

    mTabs.setDistributeEvenly(true);

    //mTabs.setSelectedIndicatorColors(getResources().getColor(R.color.tabIndicatorColour));

    mTabs.setBackgroundColor(getResources().getColor(R.color.basePrimaryBackgroundColour));

    //Setting the ViewPager as the tabs
    mTabs.setViewPager(mPager);

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    //getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    //int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    //if (id == R.id.action_settings) {
    //    return true;
    //}

    return super.onOptionsItemSelected(item);
}

class MyPagerAdapter extends FragmentPagerAdapter {


    String[] tabs;

    public  MyPagerAdapter(FragmentManager fm) {
        super(fm);

        //Initialising the strings array of the tabs
        tabs = getResources().getStringArray(R.array.tabs);

    }

    /*
    //Setting up integer array of icons
    int icons[] = {R.drawable.about_us, R.drawable.campus, R.drawable.events, R.drawable.learning, R.drawable.sewa};

    //Defined from strings.xml
    String[] tabText = getResources().getStringArray(R.array.tabs);

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
        //Initialising the strings array of tabs
        tabText = getResources().getStringArray(R.array.tabs);

    }
    */

    @Override
    public Fragment getItem(int position) {

        if (position == 0) // if the position is 0 we are returning the First tab
        {
            Tab1 tab1 = new Tab1();
            return tab1;

        } else if (position == 1)
        {
            Tab2 tab2 = new Tab2();
            return tab2;

        } else if (position == 2)
        {
            Tab3 tab3 = new Tab3();
            return tab3;

        } else if (position == 3)
        {
            Tab4 tab4 = new Tab4();
            return tab4;

        } else
        {
            Tab5 tab5 = new Tab5();
            return tab5;
        }
    }


    @Override
    public CharSequence getPageTitle(int position) {

        //Return the text of the position clicked and display this as the title for the tab
        return tabs[position];
    }

    @Override
    public int getCount() {
        return 5;
    }
  }
}

这是我的 RecyclerViewAdapterEvents.java

的代码
public class RecyclerViewAdapterEvents extends RecyclerView.Adapter<RecyclerViewAdapterEvents.MyViewHolder> {

private LayoutInflater inflater;

//private EventsActivity activity;

private List<JSONEventsItem> data = Collections.emptyList();

private Context mContext;

//Variable for the on click Listener
private ClickListener clickListener;

//Passing in the array list argument
public RecyclerViewAdapterEvents(Context context, List<JSONEventsItem> data) {

    this.mContext = context;
    //this.activity = activity;

    inflater = LayoutInflater.from(context);

    //Setting the array list data to the argument passed in
    this.data = data;

}

@Override
public RecyclerViewAdapterEvents.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    //Inflating the row and getting the root of view of the custom row (Linear Layout)
    View view = inflater.inflate(R.layout.custom_row, parent, false);

    //Passing the root view through as an argument
    MyViewHolder holder = new MyViewHolder(view);

    //Returning the view holder
    return holder;
}

@Override
public void onBindViewHolder(RecyclerViewAdapterEvents.MyViewHolder holder, int position) {

    //This will get the current position of the JSONEventItem object from the array
    JSONEventsItem eventsItem = data.get(position);

    //Setting the event name to the name of the event retrieved from the Database (converting from JSON)
    holder.eventName.setText(Html.fromHtml(eventsItem.getEventName()));

}

@Override
public int getItemCount() {

    return (null != data ? data.size() : 0);
}

public void setClickListener(ClickListener clicklistener) {
    this.clickListener = clicklistener;
}

public interface ClickListener {
}

class MyViewHolder extends RecyclerView.ViewHolder {

    TextView eventName;

    public MyViewHolder(View itemView) {
        super(itemView);

        //Here setting the id of the textview in the recycler view holder to be the list view from the custom_row xml
        eventName = (TextView) itemView.
                findViewById(R.id.listText);
    }
  }
}

以下是Tab3 Fragment的类文件, Tab3.java

public class Tab3 extends Fragment implements RecyclerViewAdapterEvents.ClickListener{

private RecyclerView mRecyclerView;

//Creating an instance of the adapter object
private RecyclerViewAdapterEvents adapter;

private List<JSONEventsItem> EventsList;

private String jsonString = "";


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View v = inflater.inflate(R.layout.tab_3,container,false);

    //Instantiating the recycler view as defined in tab_1
    mRecyclerView = (RecyclerView) v.findViewById(R.id.about_us_recycler_view);

    //Adding item decoration. Recycler view divider
    mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

    //Initialising the adapter - Passing in the activity and the getData method
    adapter = new RecyclerViewAdapterEvents(getActivity(), EventsList);

    //Here passing in the click listener into the Adapter. 'this' signifies that it is the fragment that handles the click listener.
    //This is possible as the on Click Listener interface is being implemented.
    adapter.setClickListener(this);

    //Setting the adapter
    mRecyclerView.setAdapter(adapter);

    //Setting the Layout
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    //Downloading data from below url (Universal Resource Locator) to obtain data from the Admin database
    final String url = "http://dbchudasama.webfactional.com/jsonscript.php";
    new AsyncHTTPTask().execute(url);

    return v;

    }

public class AsyncHTTPTask extends AsyncTask<String, Void, Integer> {

    @Override
    protected Integer doInBackground(String... params) {
        Integer result = 0;
        HttpURLConnection urlConnection;
        try {
            URL url = new URL(params[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            int statusCode = urlConnection.getResponseCode();

            // 200 represents HTTP OK
            if (statusCode == 200) {
                BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null) {
                    response.append(line);
                }
                jsonString = response.toString();
                parseResult();
                result = 1; // Successful
            } else {
                result = 0; //"Failed to fetch data!";
            }
        } catch (Exception e) {
            Log.d("Exception Caught", e.getLocalizedMessage());
        }
        return result; //"Failed to fetch data!";
    }

    @Override
    protected void onPostExecute(Integer result) {

        super.onPostExecute(result);

        //adapter.getItemCount();

        if (result == 1) {
            //Intent intent = getIntent();
            //intent.getSerializableExtra("JSON Admin");
            //Initialising the adapter - Passing in the activity and the parsed Admin Team List
            adapter = new RecyclerViewAdapterEvents(getActivity(), EventsList);
            //Setting the adapter
            mRecyclerView.setAdapter(adapter);
        } else {
            Toast.makeText(getActivity(), "Failed to fetch data!", Toast.LENGTH_SHORT).show();
        }
    }
}

//This method will parse the RAW data downloaded from the server
private void parseResult() {

    try {

        JSONArray AdminArrays = new JSONArray(jsonString);
        EventsList = new ArrayList<>();

        for (int i = 0; i < AdminArrays.length(); i++) {
            JSONObject AdminArrayObject = AdminArrays.getJSONObject(i);
            JSONEventsItem item = new JSONEventsItem();
            item.setEventName(AdminArrayObject.getString("eventName"));

            this.EventsList.add(item);

            Log.e("Event Name", AdminArrayObject.getString("eventName"));
        }

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

Tab3.java代码崩溃了我的所有其他选项卡,并且在getActivity()方法上给出了一个空指针异常,因为这是在空对象引用上执行的。我可以声明一个EventsActivity类型的活动并通过它来代替吗?另外,我有点不确定如何解决这个问题。为了完整起见,我还在活动 EventsActivity.java 中编写了相同的代码,我知道它将起作用。它只是让它在片段中运行。

public class EventsActivity extends BaseActivity implements RecyclerViewAdapterEvents.ClickListener {

private RecyclerView mRecyclerView;

//Creating an instance of the adapter object
private RecyclerViewAdapterEvents adapter;

private List<JSONEventsItem> EventsList;

private EventsActivity activity;

private String jsonString = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab_3);

    //Calling Activate Toolbar method (with the Back button enabled)
    activateToolbarWithHomeEnabled();

    //Instantiating the recycler view as defined in admin_team
    //mRecyclerView = (RecyclerView) findViewById(R.id.events_recycler_view);

    //Adding item decoration. Recycler view divider
    mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));

    //Initialising the adapter - Passing in the activity and the parsed Events List
    adapter = new RecyclerViewAdapterEvents(this, EventsList);

    //Setting the adapter
    mRecyclerView.setAdapter(adapter);

    //Setting the Layout
    //mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    //Downloading data from below url (Universal Resource Locator) to obtain data from the Admin database
    final String url = "http://dbchudasama.webfactional.com/jsonscript.php";
    new AsyncHTTPTask().execute(url);
}

public class AsyncHTTPTask extends AsyncTask<String, Void, Integer> {

    @Override
    protected Integer doInBackground(String... params) {
        Integer result = 0;
        HttpURLConnection urlConnection;
        try {
            URL url = new URL(params[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            int statusCode = urlConnection.getResponseCode();

            // 200 represents HTTP OK
            if (statusCode == 200) {
                BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null) {
                    response.append(line);
                }
                jsonString = response.toString();
                parseResult();
                result = 1; // Successful
            } else {
                result = 0; //"Failed to fetch data!";
            }
        } catch (Exception e) {
            Log.d("Exception Caught", e.getLocalizedMessage());
        }
        return result; //"Failed to fetch data!";
    }

    @Override
    protected void onPostExecute(Integer result) {

        super.onPostExecute(result);

        //adapter.getItemCount();

        if (result == 1) {
            //Intent intent = getIntent();
            //intent.getSerializableExtra("JSON Admin");
            //Initialising the adapter - Passing in the activity and the parsed Admin Team List
            adapter = new RecyclerViewAdapterEvents(EventsActivity.this, EventsList);
            //Setting the adapter
            mRecyclerView.setAdapter(adapter);
        } else {
            Toast.makeText(EventsActivity.this, "Failed to fetch data!", Toast.LENGTH_SHORT).show();
        }
    }
}

//This method will parse the RAW data downloaded from the server
private void parseResult() {

    try {

        JSONArray AdminArrays = new JSONArray(jsonString);
        EventsList = new ArrayList<>();

        for (int i = 0; i < AdminArrays.length(); i++) {
            JSONObject AdminArrayObject = AdminArrays.getJSONObject(i);
            JSONEventsItem item = new JSONEventsItem();
            item.setEventName(AdminArrayObject.getString("eventName"));

            this.EventsList.add(item);

            Log.e("Event Name", AdminArrayObject.getString("eventName"));
        }

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

以下是Logcat的崩溃日志:

11-09 18:56:21.587    2961-2961/com.divyeshbc.NHSF E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.divyeshbc.NHSF, PID: 2961
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.addItemDecoration(android.support.v7.widget.RecyclerView$ItemDecoration)' on a null object reference
        at com.divyeshbc.NHSF.tabs.events.Tab3.onCreateView(Tab3.java:53)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
        at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1105)
        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:551)
        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
        at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:494)
        at com.divyeshbc.NHSF.tabs.SlidingTabLayout$TabClickListener.onClick(SlidingTabLayout.java:324)
        at android.view.View.performClick(View.java:4756)
        at android.view.View$PerformClick.run(View.java:19749)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我哪里错了?任何指导都非常有用:)。

由于

0 个答案:

没有答案