Android 数据未显示在ListView中,但在打开messenger应用程序时,将显示交互数据
你好。我想问一下为什么我的listView在从服务器获取JSON响应后不显示数据。我以为数据没有提取,但当我看到日志猫时,它成功地提取了,但没有显示在我的listView中 但当我在messenger中聊天时,我回到我的应用程序,数据显示出来。起初,我不知道数据突然出现的原因。所以我想可能是延期了。所以我再试一次,等了几分钟,但什么也没发生,没有显示数据。希望你能帮我解决这个问题 我等了几分钟,结果就是这样 Logcat 当我打开信使 原木猫Android 数据未显示在ListView中,但在打开messenger应用程序时,将显示交互数据,android,json,listview,Android,Json,Listview,你好。我想问一下为什么我的listView在从服务器获取JSON响应后不显示数据。我以为数据没有提取,但当我看到日志猫时,它成功地提取了,但没有显示在我的listView中 但当我在messenger中聊天时,我回到我的应用程序,数据显示出来。起初,我不知道数据突然出现的原因。所以我想可能是延期了。所以我再试一次,等了几分钟,但什么也没发生,没有显示数据。希望你能帮我解决这个问题 我等了几分钟,结果就是这样 Logcat 当我打开信使 原木猫 12-25 20:46:26.498 30768-
12-25 20:46:26.498 30768-30768/com.sample.test D/ViewRootImpl@19e90b4[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 0
12-25 20:46:26.612 30768-30768/com.sample.test D/InputTransport: Input channel destroyed: fd=80
点击聊天框后
原木猫
12-25 20:46:26.498 30768-30768/com.sample.test D/ViewRootImpl@19e90b4[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 0
12-25 20:46:26.612 30768-30768/com.sample.test D/InputTransport: Input channel destroyed: fd=80
再次打开应用程序后
12-25 21:03:45.502 7264-7264/com.sample.test I/onResume: User is active. cancel timer
12-25 21:03:45.531 7264-7281/com.sample.test D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000, [1080x1920]-format:1
12-25 21:03:45.550 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans type: android.support.v7.widget.AppCompatTextView{1156b90 V.ED..... ......ID 24,53-64,106 #7f0800a3 app:id/sl_desc}
12-25 21:03:45.550 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans amount: android.support.v7.widget.AppCompatTextView{e44dc89 V.ED..... ......ID 928,49-1008,98 #7f0800c5 app:id/trans_amount}
12-25 21:03:45.550 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans date: android.support.v7.widget.AppCompatTextView{979d48e V.ED..... ......ID 24,106-204,155 #7f0800c4 app:id/transDate}
12-25 21:03:45.551 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans type: android.support.v7.widget.AppCompatTextView{ac82ccb V.ED..... ......ID 24,53-64,106 #7f0800a3 app:id/sl_desc}
12-25 21:03:45.551 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans amount: android.support.v7.widget.AppCompatTextView{4e31ca8 V.ED..... ......ID 928,49-1008,98 #7f0800c5 app:id/trans_amount}
12-25 21:03:45.551 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans date: android.support.v7.widget.AppCompatTextView{95e93c1 V.ED..... ......ID 24,106-204,155 #7f0800c4 app:id/transDate}
12-25 21:03:45.551 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans type: android.support.v7.widget.AppCompatTextView{a2313f2 V.ED..... ......ID 24,53-64,106 #7f0800a3 app:id/sl_desc}
12-25 21:03:45.551 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans amount: android.support.v7.widget.AppCompatTextView{2f6a43 V.ED..... ......ID 928,49-1008,98 #7f0800c5 app:id/trans_amount}
12-25 21:03:45.551 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans date: android.support.v7.widget.AppCompatTextView{962d8c0 V.ED..... ......ID 24,106-204,155 #7f0800c4 app:id/transDate}
12-25 21:03:45.552 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans type: android.support.v7.widget.AppCompatTextView{7ee3cb5 V.ED..... ......ID 24,53-64,106 #7f0800a3 app:id/sl_desc}
12-25 21:03:45.552 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans amount: android.support.v7.widget.AppCompatTextView{fed2f4a V.ED..... ......ID 928,49-1008,98 #7f0800c5 app:id/trans_amount}
12-25 21:03:45.552 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans date: android.support.v7.widget.AppCompatTextView{9a1debb V.ED..... ......ID 24,106-204,155 #7f0800c4 app:id/transDate}
12-25 21:03:45.559 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans type: android.support.v7.widget.AppCompatTextView{c7c4184 V.ED..... ......ID 24,53-64,106 #7f0800a3 app:id/sl_desc}
12-25 21:03:45.560 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans amount: android.support.v7.widget.AppCompatTextView{cf64d6d V.ED..... ......ID 928,49-1008,98 #7f0800c5 app:id/trans_amount}
12-25 21:03:45.561 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans date: android.support.v7.widget.AppCompatTextView{fc45da2 V.ED..... ......ID 24,106-204,155 #7f0800c4 app:id/transDate}
12-25 21:03:45.576 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans type: android.support.v7.widget.AppCompatTextView{2ac768f V.ED..... ......ID 0,0-0,0 #7f0800a3 app:id/sl_desc}
12-25 21:03:45.576 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans amount: android.support.v7.widget.AppCompatTextView{1283d1c V.ED..... ......ID 0,0-0,0 #7f0800c5 app:id/trans_amount}
12-25 21:03:45.576 7264-7264/com.sample.test D/SLDTL Adapter GetView: Trans date: android.support.v7.widget.AppCompatTextView{68bd25 V.ED..... ......ID 0,0-0,0 #7f0800c4 app:id/transDate}
12-25 21:03:45.577 7264-7264/com.sample.test D/AbsListView: onsize change
12-25 21:03:45.600 7264-7264/com.sample.test D/ViewRootImpl@8eff987[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1
12-25 21:03:45.601 7264-7264/com.sample.test V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@71710c6 nm : com.sample.test ic=null
12-25 21:03:45.601 7264-7264/com.sample.test I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus
12-25 21:03:45.611 7264-7264/com.sample.test D/InputTransport: Input channel constructed: fd=74
数据已成功显示在我的listView中
这是我为SLDTLFragment.java编写的代码
SLDTLAdapter.java
Add adapter.notifyDatasetChanged在将项添加到列表后,如中所示
for (int index=0; index < array.length(); index++) {
SLDTLData data= new SLDTLData();
JSONObject object = (JSONObject)array.get(index);
String tr_type= object.getString("tr_type");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + tr_type);
String credit_debit= object.getString("credit");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + credit_debit);
String tr_date= object.getString("tr_date");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + tr_date);
// Log.d("SLDTLFragment", "SL Details -------------------------------------------------------------------------------------");
data.setSldtl_trans_type(tr_type);
data.setSldtl_credit_debit(credit_debit);
data.setSldtltrans_date(tr_date);
sldtlDataList.add(data);
data.getSldtl_trans_type();
data.getSldtl_credit_debit();
data.getSldtltrans_date();
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtl_trans_type());
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtl_credit_debit());
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtltrans_date());
}
adapter.notifyDataSetChanged(); //<----- this will refresh list immediately
这种问题发生在线程中,因为您在前台线程的listView中设置适配器,并且在后台线程的列表中添加数据,所以要解决这种问题,只需在获取数据后设置listView适配器,如下所示:
// other stuf before json calling
StringRequest strReq= new StringRequest(Request.Method.POST,
AppConfig.URL_SL_DETAILS, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("SLDTLFragment onResponse", "SL Details Response: " + response.toString());
hideDialog();
try{
JSONObject jObj= new JSONObject(response.toString());
// boolean error= jObj.getBoolean("error");
if(!jObj.isNull("sl_details")){
JSONObject accountsObject = (JSONObject) jObj.get("sl_details");
// access individual json object thru jsonObject.get("FIELD_NAME")
Log.d("LoginActivity", "SL Details -error attribute : " + accountsObject.get("error").toString());
JSONArray slArray = accountsObject.optJSONArray("sl_row");
// Check if its login data i.e. user present
if (slArray != null) {
JSONArray array = accountsObject.getJSONArray("sl_row");
// access individual json array thru jsonObject.getJSONArray("FIELD_NAME")
Log.d("SLDTLFragment", "SL Details -sl_row array : " + accountsObject.getJSONArray("sl_row").toString());
for (int index=0; index < array.length(); index++) {
SLDTLData data= new SLDTLData();
JSONObject object = (JSONObject)array.get(index);
String tr_type= object.getString("tr_type");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + tr_type);
String credit_debit= object.getString("credit");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + credit_debit);
String tr_date= object.getString("tr_date");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + tr_date);
// Log.d("SLDTLFragment", "SL Details -------------------------------------------------------------------------------------");
data.setSldtl_trans_type(tr_type);
data.setSldtl_credit_debit(credit_debit);
data.setSldtltrans_date(tr_date);
sldtlDataList.add(data);
data.getSldtl_trans_type();
data.getSldtl_credit_debit();
data.getSldtltrans_date();
callListAdapter();
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtl_trans_type());
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtl_credit_debit());
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtltrans_date());
}
}
}else{
// a new JSON string that doesn't have sl_summ as member variable so display it and write new handler code
Log.d("SLDTLFragment", "Unknown JSON String : " + jObj.toString());
}
}catch(JSONException e){
e.printStackTrace();
}
}//end onResponse
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "SLDTL response Error: " + error.getMessage());
}
}){
@Override
protected Map<String, String> getParams() {
// Posting params to register url
Map<String, String> params = new HashMap<String, String>();
params.put("br_code", br_code);
params.put("client_id", client_id);
params.put("slc_code", slc);
params.put("slt_code", slt);
params.put("ref_number", ref_no);
return params;
}
};
public void callListAdapter(){
adapter= new SLDTLAdapter(getActivity(), sldtlDataList);
listView.setAdapter(adapter);
}
// other stuf
试试看。如果有任何问题,请发表评论。谢谢
public class SLDTLAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<SLDTLData> sl_data;
public SLDTLAdapter(Activity activity, List<SLDTLData>sl_data){
this.activity= activity;
this.sl_data= sl_data;
}
@Override
public View getView(int position, View ConvertView, ViewGroup parent) {
Log.d("SLDTL Adapter GetView","");
// if (inflater == null) //
// inflater = (LayoutInflater) activity
// .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//
// if (ConvertView == null)
// ConvertView = inflater.inflate(R.layout.fragment_sldtl_row, null);
ConvertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_sldtl_row, null);
TextView sl_type = (TextView) ConvertView.findViewById(R.id.sl_desc);
TextView trans_date = (TextView) ConvertView.findViewById(R.id.transDate);
TextView trans_amount = (TextView) ConvertView.findViewById(R.id.trans_amount);
TextView debitCredit = (TextView) ConvertView.findViewById(R.id.debitCredit);
SLDTLData sl= sl_data.get(position);
sl_type.setText(sl.getSldtl_trans_type());
trans_amount.setText(sl.getSldtl_credit_debit());
trans_date.setText(sl.getSldtltrans_date());
Log.d("SLDTL Adapter GetView","Trans type: " +sl_type);
Log.d("SLDTL Adapter GetView","Trans amount: " +trans_amount);
Log.d("SLDTL Adapter GetView","Trans date: " +trans_date);
return ConvertView;
}
@Override
public int getCount() {
return sl_data.size();
}
@Override
public Object getItem(int i) {
return sl_data.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
}
for (int index=0; index < array.length(); index++) {
SLDTLData data= new SLDTLData();
JSONObject object = (JSONObject)array.get(index);
String tr_type= object.getString("tr_type");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + tr_type);
String credit_debit= object.getString("credit");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + credit_debit);
String tr_date= object.getString("tr_date");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + tr_date);
// Log.d("SLDTLFragment", "SL Details -------------------------------------------------------------------------------------");
data.setSldtl_trans_type(tr_type);
data.setSldtl_credit_debit(credit_debit);
data.setSldtltrans_date(tr_date);
sldtlDataList.add(data);
data.getSldtl_trans_type();
data.getSldtl_credit_debit();
data.getSldtltrans_date();
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtl_trans_type());
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtl_credit_debit());
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtltrans_date());
}
adapter.notifyDataSetChanged(); //<----- this will refresh list immediately
// other stuf before json calling
StringRequest strReq= new StringRequest(Request.Method.POST,
AppConfig.URL_SL_DETAILS, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("SLDTLFragment onResponse", "SL Details Response: " + response.toString());
hideDialog();
try{
JSONObject jObj= new JSONObject(response.toString());
// boolean error= jObj.getBoolean("error");
if(!jObj.isNull("sl_details")){
JSONObject accountsObject = (JSONObject) jObj.get("sl_details");
// access individual json object thru jsonObject.get("FIELD_NAME")
Log.d("LoginActivity", "SL Details -error attribute : " + accountsObject.get("error").toString());
JSONArray slArray = accountsObject.optJSONArray("sl_row");
// Check if its login data i.e. user present
if (slArray != null) {
JSONArray array = accountsObject.getJSONArray("sl_row");
// access individual json array thru jsonObject.getJSONArray("FIELD_NAME")
Log.d("SLDTLFragment", "SL Details -sl_row array : " + accountsObject.getJSONArray("sl_row").toString());
for (int index=0; index < array.length(); index++) {
SLDTLData data= new SLDTLData();
JSONObject object = (JSONObject)array.get(index);
String tr_type= object.getString("tr_type");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + tr_type);
String credit_debit= object.getString("credit");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + credit_debit);
String tr_date= object.getString("tr_date");
// Log.d("SLDTLFragment", "SL Details -sle_code attribute : " + tr_date);
// Log.d("SLDTLFragment", "SL Details -------------------------------------------------------------------------------------");
data.setSldtl_trans_type(tr_type);
data.setSldtl_credit_debit(credit_debit);
data.setSldtltrans_date(tr_date);
sldtlDataList.add(data);
data.getSldtl_trans_type();
data.getSldtl_credit_debit();
data.getSldtltrans_date();
callListAdapter();
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtl_trans_type());
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtl_credit_debit());
// Log.d("SLDTLFragment", "Get SLDTL: "+ sl_data.getSldtltrans_date());
}
}
}else{
// a new JSON string that doesn't have sl_summ as member variable so display it and write new handler code
Log.d("SLDTLFragment", "Unknown JSON String : " + jObj.toString());
}
}catch(JSONException e){
e.printStackTrace();
}
}//end onResponse
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "SLDTL response Error: " + error.getMessage());
}
}){
@Override
protected Map<String, String> getParams() {
// Posting params to register url
Map<String, String> params = new HashMap<String, String>();
params.put("br_code", br_code);
params.put("client_id", client_id);
params.put("slc_code", slc);
params.put("slt_code", slt);
params.put("ref_number", ref_no);
return params;
}
};
public void callListAdapter(){
adapter= new SLDTLAdapter(getActivity(), sldtlDataList);
listView.setAdapter(adapter);
}
// other stuf