ExpandableListAdapter
を実装しましたが、明らかにうまく機能しています。アクティビティーが再開されたときを除いて、子ノードが繰り返されます。私はこれを修正する方法を知らない、私はこれをオンラインで検索して何も役に立たなかった。ExpandableList子ノードの繰り返し表示
!= null
のチェックを追加することで問題を緩和しました。したがって、不要なときに新しいデータの挿入や作成を避けることができます。しかし、それは問題を解決していません。
public class MedicosActivity extends AppCompatActivity {
private ExpandableListView listView;
private ArrayList<Contato> contatos;
private ArrayList<String> areas;
private HashMap<String, List<Contato>> contatosCollection;
private ContatoAdapter adapter;
String jsonString = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_medicos);
setTitle("Médicos | Etc");
init();
if (listView == null)
listView = (ExpandableListView) findViewById(android.R.id.list);
adapter = new ContatoAdapter(this,areas,contatosCollection);
listView.setAdapter(adapter);
listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Contato selected = (Contato) adapter.getChild(groupPosition,childPosition);
Toast.makeText(MedicosActivity.this, selected.getNome() , Toast.LENGTH_SHORT).show();
return true;
}
});
}
private void init() {
if (jsonString.isEmpty())
jsonString = JsonUtil.loadJSON(MedicosActivity.this, "data.json");
if (contatosCollection == null)
contatos = JsonUtil.parseJSON(jsonString);
if (areas == null){
areas = new ArrayList<>();
createGroupList();
}
if (contatosCollection == null){
contatosCollection = new HashMap<>();
createCollection();
}
}
private void createGroupList() {
for(Contato c : contatos){
if (!areas.contains(c.getArea())){
areas.add(c.getArea());
}
}
}
private void createCollection() {
for (Contato c : contatos){
List<Contato> ctg = contatosCollection.get(c.getArea());
if (ctg == null){
ctg = new ArrayList<>();
contatosCollection.put(c.getArea(), ctg);
}
ctg.add(c);
}
}
}
エラー原因JSON
Parserクラスの追加:
private static ArrayList<Contato> contatoList = new ArrayList<>();
public static ArrayList<Contato> parseJSON(String jsonString){
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.optJSONArray("medicos");
for (int i = 0; i < jsonArray.length(); i++){
JSONObject medicoObj = jsonArray.getJSONObject(i);
JSONObject end = medicoObj.getJSONObject("endereco");
JSONArray coord = end.getJSONArray("coord");
LatLng latLng = new LatLng(coord.getDouble(0), coord.getDouble(1));
JSONArray telefones = medicoObj.getJSONArray("telefone");
String[] tels = new String[telefones.length()];
for (int j = 0; i < telefones.length(); i++) {
tels[i] = telefones.get(i).toString();
}
Contato c = new Contato(
medicoObj.getString("area")
, medicoObj.getString("nome")
, end.getString("rua")
, Integer.parseInt(end.getString("numero"))
, end.getString("complemento")
, tels
, latLng
);
contatoList.add(c);
}
return contatoList;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
ていますか? –
はい。ありがとう、あなたは私にそれをデバッグしました。私は問題が私のアダプターであり、配列の値を調べていないと思って夢中になりたい。実際問題はArrayListで、JSONからデータを取得する際に重複していました。パーサのコードを重複をチェックするように変更しました。うまくいきました。答えを投稿します。 –