J'implémente la vue Liste extensible dans Android et j'obtiens l'erreur intitulée ci-dessus. S'il vous plaît, aidez-moi.
L'activité principale est -
package com.expand;
import Android.app.Activity;
import Android.os.Bundle;
import Android.util.DisplayMetrics;
import Android.util.Log;
import Android.view.View;
import Android.widget.ExpandableListView;
import Android.widget.Toast;
public class MyExpandableListViewActivity extends Activity {
/** Called when the activity is first created. */
static final String groupElements[]= {
"India",
"Australia",
"England",
"South Africa"
};
static final String[][] childElements=
{
{
"Sachin Tendulkar",
"Raina",
"Dhoni",
"Yuvi"
},
{
"Ponting",
"Adam Gilchrist",
"Michael Clarke"
},
{
"Andrew Strauss",
"kevin Peterson",
"Nasser Hussain"
},
{
"Graeme Smith",
"AB de villiers",
"Jacques Kallis"
}
};
DisplayMetrics metrics;
int width;
ExpandableListView expandList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
expandList = (ExpandableListView)findViewById(R.id.expandList1);
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
width = metrics.widthPixels;
//ExpAdapter adapter = new ExpAdapter(MyExpandableListViewActivity.this, groupElements, childElements);
expandList.setAdapter(new ExpAdapter(MyExpandableListViewActivity.this, groupElements, childElements));
expandList.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));
expandList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
// TODO Auto-generated method stub
Log.e("onGroupExpand", "OK");
}
});
expandList.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
// TODO Auto-generated method stub
Log.e("onGroupCollapse", "OK");
}
});
expandList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
//getting the item that is selected
//String s = (String) expandList.getItemAtPosition((int) id);
Toast.makeText(MyExpandableListViewActivity.this, "You have selected :" , Toast.LENGTH_SHORT).show();
return false;
}
});
}
public int GetDipsFromPixel(float pixels)
{
// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
return (int) (pixels * scale + 0.5f);
}
}
La classe ExpAdapter est - J'ai implémenté l'adaptateur dans une autre classe et l'ai appelé dans l'activité principale de mt
package com.expand;
import Android.content.Context;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.BaseExpandableListAdapter;
import Android.widget.TextView;
public class ExpAdapter extends BaseExpandableListAdapter {
public Context myContext;
public String[][] childElements;
TextView childValues;
public String[] groupElements;
public ExpAdapter(Context context, String[] group, String[][] childs)
{
this.myContext=context;
this.groupElements = group;
this.childElements = childs;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return childElements[groupPosition][childPosition];
}
@Override
public long getChildId(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView==null){
LayoutInflater inflator = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflator.inflate(R.layout.child_rows, parent);
}
childValues = (TextView)convertView.findViewById(R.id.rowValues);
childValues.setText(childElements[groupPosition][childPosition]);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
// TODO Auto-generated method stub
return groupElements[groupPosition].length();
}
@Override
public Object getGroup(int groupPosition) {
// TODO Auto-generated method stub
return groupElements[groupPosition];
}
@Override
public int getGroupCount() {
// TODO Auto-generated method stub
return groupElements.length;
}
@Override
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView==null){
LayoutInflater inflator = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflator.inflate(R.layout.group_rows, null);
}
TextView group = (TextView)convertView.findViewById(R.id.groupId);
group.setText(groupElements[groupPosition]);
return convertView;
}
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return true;
}
}
main.xml-
c'est le xnl qui est affiché en premier par l'activité principale
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<ExpandableListView
Android:id="@+id/expandList1"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
>
<TextView
Android:id="@+id/Android:empty"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
>
</TextView>
</ExpandableListView>
</LinearLayout>
group_row.xml
c'est le xml pour les éléments du groupe
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/gropu_name"
Android:layout_width="fill_parent"
Android:layout_height="40dp"
Android:orientation="vertical" >
<TextView
Android:id="@+id/groupId"
Android:layout_height="40dp"
Android:layout_width="wrap_content"
Android:paddingLeft="30dp"
Android:gravity="center_vertical"
Android:textSize="16dp"
Android:textStyle="bold"
/>
</LinearLayout>
child_row.xml c'est le xml pour les éléments enfants
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="40dp"
Android:orientation="horizontal" >
<TextView
Android:id="@+id/rowValues"
Android:layout_width="wrap_content"
Android:layout_height="30dp"
Android:gravity="center_vertical"
Android:paddingLeft="50dp"
Android:textSize="12dp" />
</LinearLayout>
On dirait que Adapterview ne permet pas d'ajouter une nouvelle vue, j'ai rencontré le même problème
Résolvez-le en remplaçant la ligne suivante
convertView = inflator.inflate(R.layout.child_rows, parent);
à
convertView = inflator.inflate(R.layout.child_rows, null);
[~ # ~] mise à jour [~ # ~]
Au lieu de ne pas utiliser de parent du tout, vous devez simplement dire au gonfleur de ne pas attacher la vue gonflée au parent avec
convertView = inflator.inflate(R.layout.child_rows, parent, false);
Voir aussi ceci réponse .
La raison en est que l'adaptateur se charge d'attacher des vues au parent lui-même.
Notez que vous pouvez également obtenir cette erreur lorsque votre XML de mise en page n'est pas valide.
Comme indiqué ci-dessus,
Au lieu de ne pas utiliser de parent du tout, vous devez simplement dire au gonfleur de ne pas attacher la vue gonflée au parent avec
convertView = inflator.inflate(R.layout.child_rows, parent, false);
Voir aussi ceci réponse .
La raison en est que l'adaptateur se charge d'attacher des vues au parent lui-même.
Cette erreur peut également être due à la fonction exécution instantanée. Je travaillais sur listview et à cause de cette erreur, l'application se bloquait. La désinstallation et la relance de l'application ont résolu l'erreur.
Selon Android Lint, votre vue enfant devrait toujours fournir une référence à sa vue parent lorsqu'elle est gonflée. J'ai eu exactement la même erreur dans mon code. Cela se produisait parce que TextView était placé à l'intérieur de ExpandableListView. Lorsque j'ai réorganisé ma disposition xml, l'erreur a cessé d'apparaître.