Reputation: 4578
I'm trying to add an item click listener on a ListView inside a fragment but getting errors,I'm using intellij idea.
Here is my source code:
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;
}
}
And these are the errors I'm getting.
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.access$300(Main.java:83)
Error:Android Dex: [App] at com.android.dx.command.dexer.Main$1.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
I actually get no errors at first but i only get them when I add the setOnItemClickLister.
Thanks.
Edited Here is the adapter 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;
}
}
Upvotes: 0
Views: 900
Reputation: 4578
I finally got the answer after some researching. The first error was of course from the use of lambda expression which i replaced with an anonymous inner 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();
}
});
And the lack of response from the List Items was solved by adding this line of code to the custom view of the list item (which in my case is layout/cinema_list_item.xml)
android:descendantFocusability="blocksDescendants"
which is added to the parent layout
Upvotes: 1
Reputation: 668
Try this.
listView.setOnItemClickListener((adapterView, view1, position, id) -> {
Toast.makeText(getActivity(), "ListView Clicked", Toast.LENGTH_LONG).show();
});
Upvotes: 0
Reputation: 4066
Android (unfortunately) doesn't support lambda expressions. You can either use an anonymous inner class like below, or look into using a 3rd party library like RetroLambda which provides a backport.
listView.setOnItemClickListener(
new OnItemClickListener(adapterView, view1, position, id) {
Toast.makeText(getActivity().getApplicationContext(), "ListView Clicked", Toast.LENGTH_LONG).show();
});
Upvotes: 0