- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了一个 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/
我只是想知道Mvvmmcross框架中是否潜藏着ExpandableListViews或与之相似的功能,还是这种控件不适用于多平台要求。 的功能在 http://deapsquatter.blogsp
我想知道是否可以将一个 ExpandableListView 作为另一个 ExpandableListView 的一个元素的一个子元素。谢谢 最佳答案 是的。可以在可扩展 ListView 中创建可扩
现在我想使用 ExpandableListView 来显示我的数据,我想更改项目左侧的图标或让它消失。有人可以给我一个建议吗。 谢谢。 最佳答案 setGroupIndicator(null) 应该让
我在 expandablelistview 子项目中有一个 edittext。然后,我在这个 edittext 中输入了一个文本,但是每当我点击其他 expandablelistview 标题时,我输
我正在尝试弄清楚如何构建包含(许多)的 View : PARENT1(可勾选、可扩展) CHILD1(单选按钮) CHILD2(单选按钮) ... PARENT2(可勾选、可扩展) CHILD1(可检
所以我刚刚进入了 ExpandableListView 领域,并希望在 DrawerLayout 中制作一个只有一组和 3 个 child 的简单列表 这是我的适配器代码: public cl
我是 Android 开发新手。我关注了this显示 ExpandableListView 及其正常工作的教程。如果我按所有组,那么所有组都会展开。 我一次只想扩展一组。一开始,第一个组将自动展开,如
我是 Android 新手。我想创建一个可扩展的 ListView,其中 1 行具有必须在 manin 线程中指定的自定义信息,而不是在布局中进行硬编码。 我想要一个图像和 2 个 TextView
我的应用程序中有一个 ExpandableListView。我想让子布局比组标题窄一点,并保持居中。由于一些视觉效果,我必须从代码中设置布局参数,但是我似乎找不到最好的解决方案,尝试从 xml 更
我正在将 JSON 解析为 ExpandableListView,在每个子项上,用户可以选择他想要拥有的 +/- 按钮的每个子项的数量。 +/- 按钮连接到 TextView,其中显示每个子项的总金额
我希望我的团队能够在第一时间扩大。然后它应该像往常一样运行(单击指示器后折叠/展开) 我找不到解决此问题的任何有效解决方案。 最佳答案 循环遍历所有组并使用expandGroup()您的 Expand
我正在编写一个 Android 应用程序,我决定使用可扩展 ListView 。我拥有所需的一切,列表工作正常,但是当我填充它时,组的顺序似乎与应有的顺序不同,这是一个示例: 如您所见,子值很好,只有
我在组项目的 ExpandableListView 中添加了 EditText,之后当我单击组项目时,不会出现包含子项目的列表。可能是什么问题?在这种情况下,这个列表是否可以扩展?或者禁止在Expan
当我单击组 View 时,可扩展列表的顺序会发生变化 我发现有人有类似的问题 here 顺序似乎是随机的,我不明白发生了什么。 这是我的代码,我知道它很乱,我已经重写了很多次。 public clas
我是 Android 编程的新手,我一直在思考如何做到这一点……我想创建一个 ExpandableListView,其中包含相同的子项 XML(包含添加、编辑和删除按钮)填充在所有组项目中。 有人可以
我在 Android 抽屉导航中使用 ExpandableListsViews 而不是菜单。而 OnExpandlistner 我正在改变背景颜色。前两个项目表现正常,它们的背景颜色发生了变化。但最后
我对 ExpandableListView 有疑问:在我的应用程序中,我使用了 ExpandableListView 并用我的适配器填充它“类 MyExpandableListAdapter 扩展了
我正在使用 Fedor 的适配器和图像加载器将图像延迟加载到可扩展 ListView 中。 ( Lazy load of images in ListView ) 它运行良好,但有一个问题。仅当 Im
关注this教程我能够制作一个大致这样布局的 View : Group1 child1 child2 group2 child1 child2 但是我想要更多的嵌套: grou
Blockquote 我在 android 中使用 ExpandableListView 这是适配器类中getChildView的代码: @Override public View g
我是一名优秀的程序员,十分优秀!