gpt4 book ai didi

android - ExpandableListView 重复子节点

转载 作者:行者123 更新时间:2023-11-30 01:19:50 25 4
gpt4 key购买 nike

我已经实现了一个 ExpandableListAdapter,显然它运行良好。除了当 Activity 恢复时,子节点会重复。我不知道如何解决这个问题,我在网上搜索过这个,但没有找到任何有用的信息。

我已经通过添加一些 != null 检查来缓解这个问题。从而避免在不需要时插入和创建新数据。但这并没有解决问题。

这是 CustomAdapter

public class ContatoAdapter extends BaseExpandableListAdapter {

private final Activity context;
private final Map<String, List<Contato>> contatosCollection;
private final List<String> area;

public ContatoAdapter(Activity context, List<String> area, Map<String, List<Contato>> contatosCollection) {
this.context = context;
this.contatosCollection = contatosCollection;
this.area = area;
}

@Override
public int getGroupCount() {
return area.size() ;
}

@Override
public int getChildrenCount(int groupPosition) {
return this.contatosCollection.get(area.get(groupPosition)).size();
}


@Override
public Object getGroup(int groupPosition) {
return this.area.get(groupPosition);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
return this.contatosCollection.get(this.area.get(groupPosition)).get(childPosition);
}

@Override
public long getGroupId(int groupPosition) {
return this.area.get(groupPosition).hashCode();
}

@Override
public long getChildId(int groupPosition, int childPosition) {
return this.contatosCollection.get(this.area.get(groupPosition)).get(childPosition).hashCode();
}

@Override
public boolean hasStableIds() {
return false;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
String s = (String) getGroup(groupPosition);
final LayoutInflater gInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null){
convertView = gInflater.inflate(R.layout.group_item, parent, false);
}

final TextView item = (TextView) convertView.findViewById(R.id.list_header);

item.setText(s);
item.setTypeface(null, Typeface.BOLD);

return convertView;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final Contato contato = (Contato) getChild(groupPosition, childPosition);
final LayoutInflater cInflater = this.context.getLayoutInflater();

if (convertView == null){
convertView = cInflater.inflate(R.layout.list_item, parent, false);
}

TextView item = (TextView) convertView.findViewById(R.id.list_item_nome);
ImageView ver = (ImageView) convertView.findViewById(R.id.list_item_ver);

ver.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context.getApplicationContext(), DetalheActivity.class);
intent.putExtra("contato", contato);
context.startActivity(intent);
}
});

item.setText(contato.getNome());

return convertView;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}

这是具有适配器的 listView 的 Activity :

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 解析器类:

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;
}

最佳答案

感谢 Liquid Penguin 评论,我能够检测到问题。由于我正在研究 Adapter 类的问题,所以我没有注意到来自 JSON 解析器 类的重复数据。

JSON 获取数据到数组时,它没有检查重复数据。带有所需验证的固定解析器 code 如下:

 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);
if (medicoObj.length() != contatoList.size()) {
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
);
if (!contatoList.contains(c))
contatoList.add(c);
}
}

return contatoList;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}

关于android - ExpandableListView 重复子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37269715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com