2017-01-05 8 views
0

データベースからエリアリストを表示するカスタムリストビューを作成しましたが、データが表示されないことがあります。数秒間アクティビティに滞在した後、再びアクティビティを再開すると、リストが表示されます。ここで私のコードはこれをチェックできますか?もし何が問題なのか見てください。ありがとう!カスタムリストビューがボレーリクエストで表示されない

AreaListActivity.java

private ListAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    setupActionBar(); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDisplayShowHomeEnabled(true); 

} 

@Override 
protected void onResume() { 
    super.onResume(); 
    setupList(); 
} 

@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, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    // handle arrow click here 
    if (item.getItemId() == android.R.id.home) { 
     finish(); // close this activity and return to preview activity (if there is any) 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    // Only if you need to restore open/close state when 
    // the orientation is changed 
    if (adapter != null) { 
     adapter.saveStates(outState); 
    } 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    // Only if you need to restore open/close state when 
    // the orientation is changed 
    if (adapter != null) { 
     adapter.restoreStates(savedInstanceState); 
    } 
} 

private void setupList() { 

    ListView listView = (ListView) findViewById(R.id.list_view); 
    adapter = new ListAdapter(this, createList()); 
    listView.setAdapter(adapter); 
} 

private List<String> createList() { 
    final List<String> list = new ArrayList<>(); 

    Response.Listener<String> responseListener = new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      try { 
       JSONArray jsonArray = new JSONArray(response); 
       for (int i = 0; i < jsonArray.length(); i++) { 

        JSONObject obj = jsonArray.getJSONObject(i); 
        String areaName = obj.getString("area_name"); 
        list.add(areaName); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 

    GetAreaListRequest registerRequest = new GetAreaListRequest("True", responseListener); 
    RequestQueue queue = Volley.newRequestQueue(AreaListActivity.this); 
    queue.add(registerRequest); 

    return list; 
} 

private void setupActionBar() { 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    if (getSupportActionBar() != null) { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 

     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       finish(); 
      } 
     }); 
    } 
} 

GetAreaListRequest.java

public class GetAreaListRequest extends StringRequest { 

private static final String GET_AREA_LIST_URL = "http://192.168.1.7:8080/smsams/get_area_list.php"; 
private Map<String, String> params; 

public GetAreaListRequest(String get_area_status, Response.Listener<String> listener) { 
    super(Method.POST, GET_AREA_LIST_URL, listener, null); 

    params = new HashMap<>(); 
    params.put("get_area_status", get_area_status); 

} 

@Override 
public Map<String, String> getParams() { 
    return params; 
} 

ListAdapter.java

class ListAdapter extends ArrayAdapter<String> { 
private final LayoutInflater mInflater; 
private final ViewBinderHelper binderHelper; 
private Context context; 

ListAdapter(Context context, List<String> objects) { 
    super(context, R.layout.row_list, objects); 
    mInflater = LayoutInflater.from(context); 
    binderHelper = new ViewBinderHelper(); 
    this.context = context; 
    // uncomment if you want to open only one row at a time 
    // binderHelper.setOpenOnlyOne(true); 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, @NonNull ViewGroup parent) { 
    final ViewHolder holder; 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.row_list, parent, false); 

     holder = new ViewHolder(); 
     holder.textView = (TextView) convertView.findViewById(R.id.text); 
     holder.statView = convertView.findViewById(R.id.statistic_layout); 
     holder.mapView = convertView.findViewById(R.id.map_layout); 
     holder.infoView = convertView.findViewById(R.id.info_layout); 
     holder.swipeLayout = (SwipeRevealLayout) convertView.findViewById(R.id.swipe_layout); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    final String item = getItem(position); 
    if (item != null) { 
     binderHelper.bind(holder.swipeLayout, item); 

     holder.textView.setText(item); 
     holder.statView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(context, StatisticActivity.class); 
       context.startActivity(i); 
      } 
     }); 
     holder.mapView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent i = new Intent(context, MapsActivity.class); 
       i.putExtra("soilArea", holder.mapView.toString()); 
       context.startActivity(i); 
      } 
     }); 
     holder.infoView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent i = new Intent(context, InfoViewActivity.class); 
       context.startActivity(i); 
      } 
     }); 
    } 

    return convertView; 
} 

/** 
* Only if you need to restore open/close state when the orientation is changed. 
* Call this method in {@link android.app.Activity#onSaveInstanceState(Bundle)} 
*/ 
void saveStates(Bundle outState) { 
    binderHelper.saveStates(outState); 
} 

/** 
* Only if you need to restore open/close state when the orientation is changed. 
* Call this method in {@link android.app.Activity#onRestoreInstanceState(Bundle)} 
*/ 
void restoreStates(Bundle inState) { 
    binderHelper.restoreStates(inState); 
} 

private class ViewHolder { 
    TextView textView; 
    View statView; 
    View mapView; 
    View infoView; 
    SwipeRevealLayout swipeLayout; 
} 

答えて

1

これを試してください:

private List<String> list = new ArrayList<>(); 
    private void setupList() { 

     ListView listView = (ListView) findViewById(R.id.list_view); 
     adapter = new ListAdapter(this, list); 
     listView.setAdapter(adapter); 
    } 

    private void createList() { 


     Response.Listener<String> responseListener = new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        JSONArray jsonArray = new JSONArray(response); 
        for (int i = 0; i < jsonArray.length(); i++) { 

         JSONObject obj = jsonArray.getJSONObject(i); 
         String areaName = obj.getString("area_name"); 
         list.add(areaName); 
        } 
        adapter.notifyDataSetChanged(); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

     GetAreaListRequest registerRequest = new GetAreaListRequest("True", responseListener); 
     RequestQueue queue = Volley.newRequestQueue(AreaListActivity.this); 
     queue.add(registerRequest); 


    } 
+0

完璧に機能しました!ありがとう! – FritsJ

0

通常、ネットワーク要求は非同期で発生します。したがって、onResponse()が呼び出される特定の時間はありません。だからあなたのcreateList()メソッドでは、空のarraylistを初期化し、要求が応答を生成する前に(非同期にonResponseを呼び出します)、値を含まないリストが返されます。アダプターは、データがネットワークから引き出された後にのみ設定されているので、ここで

Response.Listener<String> responseListener = new Response.Listener<String>() { 
    @Override 
    public void onResponse(String response) { 
     try { 
      JSONArray jsonArray = new JSONArray(response); 
      for (int i = 0; i < jsonArray.length(); i++) { 

       JSONObject obj = jsonArray.getJSONObject(i); 
       String areaName = obj.getString("area_name"); 
       list.add(areaName); 
       adapter = new ListAdapter(this, list); 
       listView.setAdapter(adapter); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
}; 

createList()で:

あなたは、このようなあなたのコードの何かを変更することができます。

+0

2行追加していませんでした。それを私にもっと説明できますか? – FritsJ

+1

リストビューは、データが使用可能になったときにのみ初期化されます。ここでonResponse()はデータを取得する場所です。 – Srijith

+0

コードを変更しています。私のリストビューは時には少し遅いです。ありがとう。 – FritsJ

関連する問題