片段中的 ListView OnItemClickListener 错误
ListView OnItemClickListener error in Fragment
我正在尝试在片段内的 ListView 上添加项目点击侦听器,但出现错误,我正在使用 intellij idea。
这是我的源代码:
public static class FragmentFind extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
List<CinemaListItem> list=new ArrayList<>();
list.add(new CinemaListItem("Name",0,"place",200));
View view=inflater.inflate(R.layout.fragment_find,container,false);
ListView listView=(ListView) view.findViewById(R.id.cinema_list);
listView.setAdapter(new CinemaListAdapter(getActivity(),R.layout.cinema_list_item,list));
listView.setOnItemClickListener((adapterView, view1, position, id) -> {
Toast.makeText(getActivity().getApplicationContext(), "ListView Clicked", Toast.LENGTH_LONG).show();
});
return view;
}
}
这些是我遇到的错误。
Information:Using javac 1.8.0_40 to compile java sources
Information:8/30/2015 6:04 PM - Compilation completed with 30 errors and 0 warnings in 16s 595ms
Error:Android Dex: [App] UNEXPECTED TOP-LEVEL EXCEPTION:
Error:Android Dex: [App] com.android.dx.cf.iface.ParseException:
InvokeDynamic not supported
Error:Android Dex: [App] at com.android.dx.cf.cst.ConstantPoolParser.determineOffsets(ConstantPoolParser.java:226)
Error:Android Dex: [App] at com.android.dx.cf.cst.ConstantPoolParser.parse(ConstantPoolParser.java:132)
Error:Android Dex: [App] at com.android.dx.cf.cst.ConstantPoolParser.parseIfNecessary(ConstantPoolParser.java:124)
Error:Android Dex: [App] at com.android.dx.cf.cst.ConstantPoolParser.getPool(ConstantPoolParser.java:115)
Error:Android Dex: [App] at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:482)
Error:Android Dex: [App] at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
Error:Android Dex: [App] at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
Error:Android Dex: [App] at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processClass(Main.java:704)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.access0(Main.java:83)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:602)
Error:Android Dex: [App] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:170)
Error:Android Dex: [App] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processOne(Main.java:632)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.run(Main.java:246)
Error:Android Dex: [App] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Error:Android Dex: [App] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Error:Android Dex: [App] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Error:Android Dex: [App] at java.lang.reflect.Method.invoke(Method.java:497)
Error:Android Dex: [App] at org.jetbrains.android.compiler.tools.AndroidDxRunner.runDex(AndroidDxRunner.java:161)
Error:Android Dex: [App] at org.jetbrains.android.compiler.tools.AndroidDxRunner.main(AndroidDxRunner.java:294)
Error:Android Dex: [App] at com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:130)
Error:Android Dex: [App] ...while preparsing cst 0015 at offset 0000005e
Error:Android Dex: [App] ...while parsing C:/Users/ACER 15/Desktop/Android Projects/CinemaProject/App/out/production/App/com/example/app/FragmentPageAdapter$FragmentFind.class
Error:Android Dex: [App] 1 error; aborting
一开始我实际上没有收到任何错误,但我只有在添加 setOnItemClickLister.
时才会收到错误
谢谢。
已编辑
这是适配器 class:
public class CinemaListAdapter extends ArrayAdapter<CinemaListItem>{
private List<CinemaListItem> list;
public CinemaListAdapter(Context context, int resource, List<CinemaListItem> objects) {
super(context, resource, objects);
list=objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view =convertView;
if(view==null){
LayoutInflater inflater=(LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=inflater.inflate(R.layout.cinema_list_item,parent,false);
}
TextView name=(TextView) view.findViewById(R.id.name);
TextView distance=(TextView) view.findViewById(R.id.distance);
name.setText(list.get(position).getName());
name.setTypeface(MyActivity.dekar);
int dist=list.get(position).getDistance();
distance.setText("" + dist + "m");
return view;
}
}
Android(不幸的是)不支持 lambda 表达式。您可以使用像下面这样的匿名内部 class,或者考虑使用像 RetroLambda 这样提供向后移植的第 3 方库。
listView.setOnItemClickListener(
new OnItemClickListener(adapterView, view1, position, id) {
Toast.makeText(getActivity().getApplicationContext(), "ListView Clicked", Toast.LENGTH_LONG).show();
});
试试这个。
listView.setOnItemClickListener((adapterView, view1, position, id) -> {
Toast.makeText(getActivity(), "ListView Clicked", Toast.LENGTH_LONG).show();
});
经过一番研究,我终于得到了答案。
第一个错误当然是由于使用了 lambda 表达式,我将其替换为匿名内部 class.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getActivity(), "ListView Clicked", Toast.LENGTH_LONG).show();
}
});
通过将这行代码添加到列表项的自定义视图(在我的例子中是 layout/cinema_list_item.xml)解决了列表项缺乏响应的问题
android:descendantFocusability="blocksDescendants"
添加到父布局
我正在尝试在片段内的 ListView 上添加项目点击侦听器,但出现错误,我正在使用 intellij idea。
这是我的源代码:
public static class FragmentFind extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
List<CinemaListItem> list=new ArrayList<>();
list.add(new CinemaListItem("Name",0,"place",200));
View view=inflater.inflate(R.layout.fragment_find,container,false);
ListView listView=(ListView) view.findViewById(R.id.cinema_list);
listView.setAdapter(new CinemaListAdapter(getActivity(),R.layout.cinema_list_item,list));
listView.setOnItemClickListener((adapterView, view1, position, id) -> {
Toast.makeText(getActivity().getApplicationContext(), "ListView Clicked", Toast.LENGTH_LONG).show();
});
return view;
}
}
这些是我遇到的错误。
Information:Using javac 1.8.0_40 to compile java sources
Information:8/30/2015 6:04 PM - Compilation completed with 30 errors and 0 warnings in 16s 595ms
Error:Android Dex: [App] UNEXPECTED TOP-LEVEL EXCEPTION:
Error:Android Dex: [App] com.android.dx.cf.iface.ParseException:
InvokeDynamic not supported
Error:Android Dex: [App] at com.android.dx.cf.cst.ConstantPoolParser.determineOffsets(ConstantPoolParser.java:226)
Error:Android Dex: [App] at com.android.dx.cf.cst.ConstantPoolParser.parse(ConstantPoolParser.java:132)
Error:Android Dex: [App] at com.android.dx.cf.cst.ConstantPoolParser.parseIfNecessary(ConstantPoolParser.java:124)
Error:Android Dex: [App] at com.android.dx.cf.cst.ConstantPoolParser.getPool(ConstantPoolParser.java:115)
Error:Android Dex: [App] at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:482)
Error:Android Dex: [App] at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
Error:Android Dex: [App] at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
Error:Android Dex: [App] at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processClass(Main.java:704)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.access0(Main.java:83)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:602)
Error:Android Dex: [App] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:170)
Error:Android Dex: [App] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processOne(Main.java:632)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main.run(Main.java:246)
Error:Android Dex: [App] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Error:Android Dex: [App] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Error:Android Dex: [App] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Error:Android Dex: [App] at java.lang.reflect.Method.invoke(Method.java:497)
Error:Android Dex: [App] at org.jetbrains.android.compiler.tools.AndroidDxRunner.runDex(AndroidDxRunner.java:161)
Error:Android Dex: [App] at org.jetbrains.android.compiler.tools.AndroidDxRunner.main(AndroidDxRunner.java:294)
Error:Android Dex: [App] at com.intellij.rt.execution.CommandLineWrapper.main(CommandLineWrapper.java:130)
Error:Android Dex: [App] ...while preparsing cst 0015 at offset 0000005e
Error:Android Dex: [App] ...while parsing C:/Users/ACER 15/Desktop/Android Projects/CinemaProject/App/out/production/App/com/example/app/FragmentPageAdapter$FragmentFind.class
Error:Android Dex: [App] 1 error; aborting
一开始我实际上没有收到任何错误,但我只有在添加 setOnItemClickLister.
时才会收到错误谢谢。
已编辑 这是适配器 class:
public class CinemaListAdapter extends ArrayAdapter<CinemaListItem>{
private List<CinemaListItem> list;
public CinemaListAdapter(Context context, int resource, List<CinemaListItem> objects) {
super(context, resource, objects);
list=objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view =convertView;
if(view==null){
LayoutInflater inflater=(LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=inflater.inflate(R.layout.cinema_list_item,parent,false);
}
TextView name=(TextView) view.findViewById(R.id.name);
TextView distance=(TextView) view.findViewById(R.id.distance);
name.setText(list.get(position).getName());
name.setTypeface(MyActivity.dekar);
int dist=list.get(position).getDistance();
distance.setText("" + dist + "m");
return view;
}
}
Android(不幸的是)不支持 lambda 表达式。您可以使用像下面这样的匿名内部 class,或者考虑使用像 RetroLambda 这样提供向后移植的第 3 方库。
listView.setOnItemClickListener(
new OnItemClickListener(adapterView, view1, position, id) {
Toast.makeText(getActivity().getApplicationContext(), "ListView Clicked", Toast.LENGTH_LONG).show();
});
试试这个。
listView.setOnItemClickListener((adapterView, view1, position, id) -> {
Toast.makeText(getActivity(), "ListView Clicked", Toast.LENGTH_LONG).show();
});
经过一番研究,我终于得到了答案。 第一个错误当然是由于使用了 lambda 表达式,我将其替换为匿名内部 class.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getActivity(), "ListView Clicked", Toast.LENGTH_LONG).show();
}
});
通过将这行代码添加到列表项的自定义视图(在我的例子中是 layout/cinema_list_item.xml)解决了列表项缺乏响应的问题
android:descendantFocusability="blocksDescendants"
添加到父布局