我需要帮助解决问题的逻辑。我已经在这里搜索过讨论类似问题的帖子,但是我还没有成功解决我的问题,所以我不想把它作为重复的帖子。
我正在处理一个应用程序,我在幻灯片选项卡片段中的回收器视图中显示已解析的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)
我哪里错了?任何指导都非常有用:)。
由于