片段中的 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"

添加到父布局