Android 第一次启动fragment时ListView不显示内容
Android ListView doesn't show content when fragment is initiated for the first time
我在片段中有一个列表视图,其中有一个自定义适配器从我的 mysql 数据库加载产品列表。当我第一次从导航抽屉 activity 导航到该片段时,它没有显示任何项目,但在日志中打印了相同的项目。但是当第二次启动同一个片段时,所有项目都是可见的。
这是我在片段的 onCreateView() 中的代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view_complain, container, false);
sharedPreferences = getActivity().getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
new BackgroundViewComplainTask().execute();
jsonString = sharedPreferences.getString("complain", "");
complainList = (ListView)view.findViewById(R.id.list);
addComplain = (Button)view.findViewById(R.id.addComplain);
String productName, serial, complainType, complainMessage, added_on;
viewComplainAdapter = new ViewComplainAdapter(this.getActivity(), R.layout.complain_layout);
try {
Log.d("json",jsonString);
jsonObject = new JSONObject(jsonString);
jsonArray = jsonObject.getJSONArray("server_response");
int count = 0;
ViewComplainsList viewComplainsList;
while (count<jsonArray.length()){
JSONObject JO = jsonArray.getJSONObject(count);
productName = JO.getString("productName");
serial = JO.getString("serial");
complainType = JO.getString("complainType");
complainMessage = JO.getString("complainMessage");
added_on = JO.getString("added_on");
viewComplainsList = new ViewComplainsList(complainMessage, complainType, productName, serial, added_on);
viewComplainAdapter.add(viewComplainsList);
count++;
}
complainList.setAdapter(viewComplainAdapter);
viewComplainAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
if(jsonString.isEmpty()){
Toast.makeText(getActivity(),"No Complains found",Toast.LENGTH_LONG).show();
this.startActivity(new Intent(getActivity(), MainActivity.class));
}
addComplain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.main_activity_frame, new AddComplainFragment()).addToBackStack("complainFragment").commit();
}
});
return view;
}
jsonString 确实打印在日志中。
这是我的 activity 日志:
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: org.json.JSONException: End of input at character 0 of
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at org.json.JSONTokener.nextValue(JSONTokener.java:97)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at org.json.JSONObject.(JSONObject.java:156)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at org.json.JSONObject.(JSONObject.java:173)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at com.example.thadaninilesh.productapp.ViewComplainFragment.onCreateView(ViewComplainFragment.java:72)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.Fragment.performCreateView(Fragment.java:2053)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.BackStackRecord.run(BackStackRecord.java:834)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.FragmentManagerImpl.run(FragmentManager.java:447)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.os.Looper.loop(Looper.java:135)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5254)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at java.lang.reflect.Method.invoke(Native Method)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
06-08 15:08:27.480 10110-10394/com.example.thadaninilesh.productapp D/response: {"server_response":[{"serial":"123456789QWERT","complainType":"qwerty","complainMessage":"The body is completely damaged","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"qwerty","complainMessage":"The body is completely damaged","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"qwerty","complainMessage":"The body is completely damaged","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"qwertyu","complainMessage":"The body is completely damaged","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"Physical Condition","complainMessage":"--","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"12345678DFGBH","complainType":"sdcwsdw","complainMessage":"wdwdf","added_on":"08-06-2016","productName":"Galaxy J7"},{"serial":"12345678DFGBH","complainType":"asd","complainMessage":"--","added_on":"08-06-2016 08:06","productName":"Galaxy J7"}]}
您在获取数据之前调用 viewComplainAdapter.notifyDataSetChanged();
。
您应该在创建 Fragment
之后调用它,或者至少在获取数据之后调用它:
while (count<jsonArray.length()){
JSONObject JO = jsonArray.getJSONObject(count);
if(JO.getString("productName").isEmpty()){
startActivity(new Intent(this.getActivity(), LoginActivity.class));
}
productName = JO.getString("productName");
serial = JO.getString("serial");
complainType = JO.getString("complainType");
complainMessage = JO.getString("complainMessage");
added_on = JO.getString("added_on");
Log.d("productName",productName);
ViewComplainsList viewComplainsList = new ViewComplainsList(complainMessage, complainType, productName, serial, added_on);
viewComplainAdapter.add(viewComplainsList);
count++;
}
viewComplainAdapter.notifyDataSetChanged(); // here
检查下面的代码。
viewComplainAdapter = new ViewComplainAdapter(this.getActivity(), R.layout.complain_layout);
complainList.setAdapter(viewComplainAdapter);
在这里,您正在使用 Activity 上下文和布局资源创建 ViewComplainAdapter class 的对象,因此您没有传递要显示的数据。所以第一次片段实例化,列表视图无法显示任何数据。
之后,您将向 server.Check 下面的行发送请求。
new BackgroundViewComplainTask().execute();
从服务器获得响应后,您正在将值添加到 ViewComplainAdapter 。
while (count<jsonArray.length()){
JSONObject JO = jsonArray.getJSONObject(count);
productName = JO.getString("productName");
serial = JO.getString("serial");
complainType = JO.getString("complainType");
complainMessage = JO.getString("complainMessage");
added_on = JO.getString("added_on");
Log.d("productName",productName);
ViewComplainsList viewComplainsList = new ViewComplainsList(complainMessage, complainType, productName, serial, added_on);
viewComplainAdapter.add(viewComplainsList);
count++;
}
所以当你第二次调用Fragment时,ViewComplainAdapter可以在listviw中显示数据。
要解决此问题,仅在获得响应后,将适配器设置为列表视图,以便您可以看到带有数据列表的片段。
我解决了...
问题是执行顺序。调用 Asynctask 后,我没有等待它完成,而是在从服务器获取 json 字符串之前填充列表视图。
通过在 Asynctask 的 onPostExecute 方法中填充列表视图来解决它。
感谢那些试图帮助我的人。
我在片段中有一个列表视图,其中有一个自定义适配器从我的 mysql 数据库加载产品列表。当我第一次从导航抽屉 activity 导航到该片段时,它没有显示任何项目,但在日志中打印了相同的项目。但是当第二次启动同一个片段时,所有项目都是可见的。 这是我在片段的 onCreateView() 中的代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_view_complain, container, false);
sharedPreferences = getActivity().getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
new BackgroundViewComplainTask().execute();
jsonString = sharedPreferences.getString("complain", "");
complainList = (ListView)view.findViewById(R.id.list);
addComplain = (Button)view.findViewById(R.id.addComplain);
String productName, serial, complainType, complainMessage, added_on;
viewComplainAdapter = new ViewComplainAdapter(this.getActivity(), R.layout.complain_layout);
try {
Log.d("json",jsonString);
jsonObject = new JSONObject(jsonString);
jsonArray = jsonObject.getJSONArray("server_response");
int count = 0;
ViewComplainsList viewComplainsList;
while (count<jsonArray.length()){
JSONObject JO = jsonArray.getJSONObject(count);
productName = JO.getString("productName");
serial = JO.getString("serial");
complainType = JO.getString("complainType");
complainMessage = JO.getString("complainMessage");
added_on = JO.getString("added_on");
viewComplainsList = new ViewComplainsList(complainMessage, complainType, productName, serial, added_on);
viewComplainAdapter.add(viewComplainsList);
count++;
}
complainList.setAdapter(viewComplainAdapter);
viewComplainAdapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
if(jsonString.isEmpty()){
Toast.makeText(getActivity(),"No Complains found",Toast.LENGTH_LONG).show();
this.startActivity(new Intent(getActivity(), MainActivity.class));
}
addComplain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.main_activity_frame, new AddComplainFragment()).addToBackStack("complainFragment").commit();
}
});
return view;
}
jsonString 确实打印在日志中。
这是我的 activity 日志:
06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: org.json.JSONException: End of input at character 0 of 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at org.json.JSONTokener.syntaxError(JSONTokener.java:450) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at org.json.JSONTokener.nextValue(JSONTokener.java:97) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at org.json.JSONObject.(JSONObject.java:156) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at org.json.JSONObject.(JSONObject.java:173) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at com.example.thadaninilesh.productapp.ViewComplainFragment.onCreateView(ViewComplainFragment.java:72) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.Fragment.performCreateView(Fragment.java:2053) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.BackStackRecord.run(BackStackRecord.java:834) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.FragmentManagerImpl.run(FragmentManager.java:447) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.os.Handler.handleCallback(Handler.java:739) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.os.Looper.loop(Looper.java:135) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5254) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at java.lang.reflect.Method.invoke(Native Method) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at java.lang.reflect.Method.invoke(Method.java:372) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 06-08 15:08:27.450 10110-10110/com.example.thadaninilesh.productapp W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 06-08 15:08:27.480 10110-10394/com.example.thadaninilesh.productapp D/response: {"server_response":[{"serial":"123456789QWERT","complainType":"qwerty","complainMessage":"The body is completely damaged","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"qwerty","complainMessage":"The body is completely damaged","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"qwerty","complainMessage":"The body is completely damaged","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"qwertyu","complainMessage":"The body is completely damaged","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"123456789QWERT","complainType":"Physical Condition","complainMessage":"--","added_on":"08-06-2016","productName":"Acer Travelmate"},{"serial":"12345678DFGBH","complainType":"sdcwsdw","complainMessage":"wdwdf","added_on":"08-06-2016","productName":"Galaxy J7"},{"serial":"12345678DFGBH","complainType":"asd","complainMessage":"--","added_on":"08-06-2016 08:06","productName":"Galaxy J7"}]}
您在获取数据之前调用 viewComplainAdapter.notifyDataSetChanged();
。
您应该在创建 Fragment
之后调用它,或者至少在获取数据之后调用它:
while (count<jsonArray.length()){
JSONObject JO = jsonArray.getJSONObject(count);
if(JO.getString("productName").isEmpty()){
startActivity(new Intent(this.getActivity(), LoginActivity.class));
}
productName = JO.getString("productName");
serial = JO.getString("serial");
complainType = JO.getString("complainType");
complainMessage = JO.getString("complainMessage");
added_on = JO.getString("added_on");
Log.d("productName",productName);
ViewComplainsList viewComplainsList = new ViewComplainsList(complainMessage, complainType, productName, serial, added_on);
viewComplainAdapter.add(viewComplainsList);
count++;
}
viewComplainAdapter.notifyDataSetChanged(); // here
检查下面的代码。
viewComplainAdapter = new ViewComplainAdapter(this.getActivity(), R.layout.complain_layout); complainList.setAdapter(viewComplainAdapter); 在这里,您正在使用 Activity 上下文和布局资源创建 ViewComplainAdapter class 的对象,因此您没有传递要显示的数据。所以第一次片段实例化,列表视图无法显示任何数据。
之后,您将向 server.Check 下面的行发送请求。
new BackgroundViewComplainTask().execute();
从服务器获得响应后,您正在将值添加到 ViewComplainAdapter 。
while (count<jsonArray.length()){
JSONObject JO = jsonArray.getJSONObject(count);
productName = JO.getString("productName");
serial = JO.getString("serial");
complainType = JO.getString("complainType");
complainMessage = JO.getString("complainMessage");
added_on = JO.getString("added_on");
Log.d("productName",productName);
ViewComplainsList viewComplainsList = new ViewComplainsList(complainMessage, complainType, productName, serial, added_on);
viewComplainAdapter.add(viewComplainsList);
count++;
}
所以当你第二次调用Fragment时,ViewComplainAdapter可以在listviw中显示数据。
要解决此问题,仅在获得响应后,将适配器设置为列表视图,以便您可以看到带有数据列表的片段。
我解决了... 问题是执行顺序。调用 Asynctask 后,我没有等待它完成,而是在从服务器获取 json 字符串之前填充列表视图。 通过在 Asynctask 的 onPostExecute 方法中填充列表视图来解决它。 感谢那些试图帮助我的人。