在可扩展列表子项单击中显示 Toast 时出错
Error on showing Toast in ExpandableList child item click
我在 Fragment 中使用扩展 BaseExpandableListAdapter 的 ExpandableListView,并在 ViewPager 中显示它。单击它时,我试图显示子项的每个 TextView 的文本。我不知道为什么当我按下一个子项目时它会关闭应用程序。有人可以帮我吗?非常感谢!
这是我的片段和适配器:
public class SavedTabsFragment extends Fragment {
private ArrayList<String> parentItems = new ArrayList<>();
private ArrayList<Object> childItems = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_explistview, null);
ExpandableListView elv = (ExpandableListView) v.findViewById(R.id.expandableListView1);
elv.setGroupIndicator(null);
elv.setClickable(true);
setGroupParents();
setChildData();
SavedTabsListAdapter adapter = new SavedTabsListAdapter(parentItems, childItems);
adapter.setInflater((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE), this);
elv.setAdapter(adapter);
// elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
// @Override
// public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
// Toast.makeText(getActivity()," holaaa",Toast.LENGTH_SHORT).show();
//
// return false;
// }
// });
return v;
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//TODO
}
public static SavedTabsFragment newInstance(){
SavedTabsFragment savedTabsFragment = new SavedTabsFragment();
Bundle args = new Bundle();
//TODO info del bundle
return savedTabsFragment;
}
public void setGroupParents() {
parentItems.add("Androwwid");
parentItems.add("Core Java");
parentItems.add("Desktop Java");
parentItems.add("Enterprise Java");
}
public void setChildData() {
// Android
ArrayList<String> child = new ArrayList<>();
child.add("Core");
child.add("Games");
childItems.add(child);
// Core Java
child = new ArrayList<>();
child.add("Apache");
child.add("Applet");
child.add("AspectJ");
child.add("Beans");
child.add("Crypto");
childItems.add(child);
// Desktop Java
child = new ArrayList<>();
child.add("Accessibility");
child.add("AWT");
child.add("ImageIO");
child.add("Print");
childItems.add(child);
// Enterprise Java
child = new ArrayList<>();
child.add("EJB3");
child.add("GWT");
child.add("Hibernate");
child.add("JSP");
childItems.add(child);
}
public class SavedTabsListAdapter extends BaseExpandableListAdapter {
private ArrayList<String> parentItems, child;
private ArrayList<Object> childItems;
private LayoutInflater inflater;
private Activity activity;
public SavedTabsListAdapter(ArrayList<String> parentItems, ArrayList<Object> childItems) {
this.childItems = childItems;
this.parentItems = parentItems;
}
public int getGroupCount() {
return parentItems.size();
}
public int getChildrenCount(int i) {
return ((ArrayList<String>) childItems.get(i)).size();
}
public Object getGroup(int i) {
return parentItems.get(i);
}
public Object getChild(int i, int i1) {
return null;
}
public long getGroupId(int i) {
return 0;
}
public long getChildId(int i, int i1) {
return 0;
}
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.row, null);
}
((CheckedTextView) convertView).setText(parentItems.get(groupPosition));
((CheckedTextView) convertView).setChecked(isExpanded);
return convertView;
}
@Override
public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
child = (ArrayList<String>) childItems.get(groupPosition);
TextView textView = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.group, null);
}
textView = new TextView(SavedTabsFragment.this.getActivity());
textView = (TextView) convertView.findViewById(R.id.textView1);
textView.setText(child.get(childPosition));
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(activity, child.get(childPosition)+" holaaa",
Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return true;
}
@Override
public void onGroupCollapsed(int groupPosition) {
super.onGroupCollapsed(groupPosition);
}
@Override
public void onGroupExpanded(int groupPosition) {
super.onGroupExpanded(groupPosition);
}
public void setInflater(LayoutInflater inflater, SavedTabsFragment savedTabsFragment) {
this.inflater = inflater;
// this = savedTabsFragment;
}
}
}
这是我的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_fragment_exp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/expandableListView1"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:cacheColorHint="@android:color/transparent"
android:divider="@android:color/transparent"
android:dividerHeight="20dp"
android:childDivider="@android:color/transparent"
android:scrollbarStyle="outsideOverlay"
android:paddingBottom="7dp"
android:paddingLeft="9dp"
android:paddingRight="9dp"
android:paddingTop="10dp"
/>
</RelativeLayout>
编辑:
这是 logcat 消息:
05-08 11:58:12.395 18706-18706/com.example.julio.listviewactionbar E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.julio.listviewactionbar, PID: 18706
java.lang.NullPointerException
at android.widget.Toast.<init>(Toast.java:93)
at android.widget.Toast.makeText(Toast.java:241)
at com.example.julio.listviewactionbar.SavedTabsFragment$SavedTabsListAdapter.onClick(SavedTabsFragment.java:245)
at android.view.View.performClick(View.java:4569)
at android.view.View$PerformClick.run(View.java:18570)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5196)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
使用OnItemClickListener,而不是OnChildClickListener
我认为 activity 为空。你为什么不像下面这样在 toast 方法中传递 getActivity'。
Toast.makeText(getActivity(), child.get(childPosition)+" holaaa",
Toast.LENGTH_SHORT).show();
我在 Fragment 中使用扩展 BaseExpandableListAdapter 的 ExpandableListView,并在 ViewPager 中显示它。单击它时,我试图显示子项的每个 TextView 的文本。我不知道为什么当我按下一个子项目时它会关闭应用程序。有人可以帮我吗?非常感谢!
这是我的片段和适配器:
public class SavedTabsFragment extends Fragment {
private ArrayList<String> parentItems = new ArrayList<>();
private ArrayList<Object> childItems = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_explistview, null);
ExpandableListView elv = (ExpandableListView) v.findViewById(R.id.expandableListView1);
elv.setGroupIndicator(null);
elv.setClickable(true);
setGroupParents();
setChildData();
SavedTabsListAdapter adapter = new SavedTabsListAdapter(parentItems, childItems);
adapter.setInflater((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE), this);
elv.setAdapter(adapter);
// elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
// @Override
// public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
// Toast.makeText(getActivity()," holaaa",Toast.LENGTH_SHORT).show();
//
// return false;
// }
// });
return v;
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//TODO
}
public static SavedTabsFragment newInstance(){
SavedTabsFragment savedTabsFragment = new SavedTabsFragment();
Bundle args = new Bundle();
//TODO info del bundle
return savedTabsFragment;
}
public void setGroupParents() {
parentItems.add("Androwwid");
parentItems.add("Core Java");
parentItems.add("Desktop Java");
parentItems.add("Enterprise Java");
}
public void setChildData() {
// Android
ArrayList<String> child = new ArrayList<>();
child.add("Core");
child.add("Games");
childItems.add(child);
// Core Java
child = new ArrayList<>();
child.add("Apache");
child.add("Applet");
child.add("AspectJ");
child.add("Beans");
child.add("Crypto");
childItems.add(child);
// Desktop Java
child = new ArrayList<>();
child.add("Accessibility");
child.add("AWT");
child.add("ImageIO");
child.add("Print");
childItems.add(child);
// Enterprise Java
child = new ArrayList<>();
child.add("EJB3");
child.add("GWT");
child.add("Hibernate");
child.add("JSP");
childItems.add(child);
}
public class SavedTabsListAdapter extends BaseExpandableListAdapter {
private ArrayList<String> parentItems, child;
private ArrayList<Object> childItems;
private LayoutInflater inflater;
private Activity activity;
public SavedTabsListAdapter(ArrayList<String> parentItems, ArrayList<Object> childItems) {
this.childItems = childItems;
this.parentItems = parentItems;
}
public int getGroupCount() {
return parentItems.size();
}
public int getChildrenCount(int i) {
return ((ArrayList<String>) childItems.get(i)).size();
}
public Object getGroup(int i) {
return parentItems.get(i);
}
public Object getChild(int i, int i1) {
return null;
}
public long getGroupId(int i) {
return 0;
}
public long getChildId(int i, int i1) {
return 0;
}
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.row, null);
}
((CheckedTextView) convertView).setText(parentItems.get(groupPosition));
((CheckedTextView) convertView).setChecked(isExpanded);
return convertView;
}
@Override
public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
child = (ArrayList<String>) childItems.get(groupPosition);
TextView textView = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.group, null);
}
textView = new TextView(SavedTabsFragment.this.getActivity());
textView = (TextView) convertView.findViewById(R.id.textView1);
textView.setText(child.get(childPosition));
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(activity, child.get(childPosition)+" holaaa",
Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return true;
}
@Override
public void onGroupCollapsed(int groupPosition) {
super.onGroupCollapsed(groupPosition);
}
@Override
public void onGroupExpanded(int groupPosition) {
super.onGroupExpanded(groupPosition);
}
public void setInflater(LayoutInflater inflater, SavedTabsFragment savedTabsFragment) {
this.inflater = inflater;
// this = savedTabsFragment;
}
}
}
这是我的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_fragment_exp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/expandableListView1"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:cacheColorHint="@android:color/transparent"
android:divider="@android:color/transparent"
android:dividerHeight="20dp"
android:childDivider="@android:color/transparent"
android:scrollbarStyle="outsideOverlay"
android:paddingBottom="7dp"
android:paddingLeft="9dp"
android:paddingRight="9dp"
android:paddingTop="10dp"
/>
</RelativeLayout>
编辑:
这是 logcat 消息:
05-08 11:58:12.395 18706-18706/com.example.julio.listviewactionbar E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.julio.listviewactionbar, PID: 18706
java.lang.NullPointerException
at android.widget.Toast.<init>(Toast.java:93)
at android.widget.Toast.makeText(Toast.java:241)
at com.example.julio.listviewactionbar.SavedTabsFragment$SavedTabsListAdapter.onClick(SavedTabsFragment.java:245)
at android.view.View.performClick(View.java:4569)
at android.view.View$PerformClick.run(View.java:18570)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5196)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)
使用OnItemClickListener,而不是OnChildClickListener
我认为 activity 为空。你为什么不像下面这样在 toast 方法中传递 getActivity'。
Toast.makeText(getActivity(), child.get(childPosition)+" holaaa",
Toast.LENGTH_SHORT).show();