Androidで展開可能なリストビューを実装していますが、上記のタイトルのエラーが表示されます。手伝ってください。
主な活動は-
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);
}
}
ExpAdapterクラスは-他のクラスにアダプターを実装し、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-
これは、メインアクティビティによって最初に表示されるxnlです
<?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
これはグループ要素のxmlです
<?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これは子要素のxmlです
<?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>
Adapterviewでは新しいビューの追加が許可されていないようですが、同じ問題が発生しました
次の行を置き換えて解決してください
convertView = inflator.inflate(R.layout.child_rows, parent);
に
convertView = inflator.inflate(R.layout.child_rows, null);
[〜#〜] update [〜#〜]
親をまったく使用しないのではなく、単にInflaterに、膨張したビューを親にアタッチしないように指示する必要があります
convertView = inflator.inflate(R.layout.child_rows, parent, false);
こちらもご覧ください answer 。
その理由は、アダプタがビューを親自体にアタッチすることです。
レイアウトxmlが無効な場合にもこのエラーが発生する可能性があることに注意してください。
上記のように、
親をまったく使用しないのではなく、単にInflaterに、膨張したビューを親にアタッチしないように指示する必要があります
convertView = inflator.inflate(R.layout.child_rows, parent, false);
こちらもご覧ください answer 。
その理由は、アダプタがビューを親自体にアタッチすることです。
このエラーは、instant run機能が原因で発生することもあります。私はリストビューで作業していましたが、このエラーアプリのためにクラッシュし続けました。アプリをアンインストールして再度実行すると、エラーが解決しました。
Android Lintによると、子ビューは、膨らんだときに常に親ビューへの参照を提供する必要があります。コードにまったく同じエラーがありました。 xmlレイアウトを再配置すると、エラーが表示されなくなりました。