单击列表项时应用程序崩溃:FATAL EXCEPTION: main, .onItemClick

Posted

技术标签:

【中文标题】单击列表项时应用程序崩溃:FATAL EXCEPTION: main, .onItemClick【英文标题】:App crashes when clicking on list item: FATAL EXCEPTION: main, .onItemClick 【发布时间】:2021-02-26 02:28:57 【问题描述】:

这段代码在 Eclipse 中运行良好,但现在我导入到 android studio 4.1.1。我拥有所有最新更新和正确的库,尝试使缓存无效并重新启动、清理、尝试不同的设备并尝试不同的 API 级别。我的应用程序启动良好,但是当我单击任何列表项时它会崩溃。第 154 行是数组排序。

@SuppressLint("UseValueOf")
public class CribActivity extends Activity

private ListView lv1;
private EditText et;
private final String[] lv_arr =
        "item 1",
        "items amid 1 - 66 here is a lot",
        "Item 66th"
;
private final ArrayList<String> array_sort= new ArrayList<>();
int textlength=0;


@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    lv1 = findViewById(R.id.listView);
    et = findViewById(R.id.EditText01);

    lv1 = findViewById(R.id.listView);

    lv1.setAdapter(
            new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, lv_arr));
    lv1.setTextFilterEnabled(true);


    et.addTextChangedListener(new TextWatcher()
    
        public void afterTextChanged(Editable s)
        
            // Abstract Method of TextWatcher Interface.
        
        public void beforeTextChanged(CharSequence s,
                                      int start, int count, int after)
        
            // Abstract Method of TextWatcher Interface.
        
        public void onTextChanged(CharSequence s,
                                  int start, int before, int count)
        
            textlength = et.getText().length();
            array_sort.clear();
            for (String value : lv_arr) 
                if (textlength <= value.length()) 
                    if (et.getText().toString().equalsIgnoreCase(
                            (String)
                                    value.subSequence(0,
                                            textlength))) 
                        array_sort.add(value);
                    
                
            
            lv1.setAdapter(new ArrayAdapter<>
                    (CribActivity.this,
                            android.R.layout.simple_list_item_1, array_sort));
        
    );


    lv1.setOnItemClickListener(new OnItemClickListener() 

        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
            String name;
            name = array_sort.get(position);
            for (int i = 0; i < lv_arr.length; i++) 

                if (lv_arr[i]
                        .equalsIgnoreCase(
                                name)) 
                    position = i;

                    break;
                

            



            String itemname = Integer.toString(position);

            Intent intent = new Intent();

            intent.setClass(CribActivity.this, ViewActivity.class);

            Bundle b = new Bundle();


            b.putString("defStrID", itemname);

            intent.putExtras(b);


            startActivity(intent);
        
    );

日志猫:

E/FirebaseInstanceId: Token retrieval failed: SERVICE_NOT_AVAILABLE
E/FirebaseInstanceId: Token retrieval failed: INVALID_SENDER

运行中的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: ru.tablica.sputnikovyh, PID: 13145
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.get(ArrayList.java:437)
    at ru.tablica.sputnikovyh.CribActivity$2.onItemClick(CribActivity.java:154)
    at android.widget.AdapterView.performItemClick(AdapterView.java:318)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1159)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3136)
    at android.widget.AbsListView.onTouchUp(AbsListView.java:4064)
    at android.widget.AbsListView.onTouchEvent(AbsListView.java:3822)
    at android.view.View.dispatchTouchEvent(View.java:12513)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3024)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2705)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2719)
    at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440)
    at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830)
    at android.app.Activity.dispatchTouchEvent(Activity.java:3400)
    at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398)
    at android.view.View.dispatchPointerEvent(View.java:12752)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5106)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4909)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4585)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4642)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4479)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4445)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4453)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4426)
    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)
    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7061)
    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7022)
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7195)
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:186)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:326)
    at android.os.Looper.loop(Looper.java:160)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

【问题讨论】:

lv_arr 没有项目,因此无法返回值。请提供您如何初始化lv_arr private final String[] lv_arr =...list items; private final ArrayList&lt;String&gt; array_sort= new ArrayList&lt;&gt;(); int textlength=0; 您是否在这些列表中填充了数据? @Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); lv1 = findViewById(R.id.listView); et = findViewById(R.id.EditText01); lv1 = findViewById(R.id.listView); lv1.setAdapter( new ArrayAdapter&lt;&gt;(this, android.R.layout.simple_list_item_1, lv_arr)); lv1.setTextFilterEnabled(true); 是它在数组中的数据 【参考方案1】:

android spinners 有一个问题,当您启动包含此微调器的活动时,onItemClick 会在第一项(索引为 0)中获得 called unintentionally。我怀疑这是在将数据加载到导致此异常的列表之前调用的。

在获取如下数据之前尝试检查列表是否已加载

lv1.setOnItemClickListener(new OnItemClickListener() 

        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
            String name;

            if (array_sort.size() <= 0) return; // <<<<<<< change here
            if (lv_arr.length <=0) return; // <<<<<<< change here

            name = array_sort.get(position);
            for (int i = 0; i < lv_arr.length; i++) 

                if (lv_arr[i]
                        .equalsIgnoreCase(
                                name)) 
                    position = i;

                    break;
                

            

【讨论】:

谢谢 Zain,但现在它们无法点击,但是当我搜索然后点击时,它会打开,错误是:E/eglCodecCommon: glUtilsParamSize: unknow param 0x000085b5 glUtilsParamSize: unknow param 0x000085b5 这似乎不是一个完整的堆栈跟踪,您可以调试一下,看看您是否超出了我在微调器中放置的两个条件? E/eglCodecCommon:GoldfishAddressSpaceHostMemoryAllocator:ioctl_ping 设备类型=5 失败,ret=-1 E/cr_VariationsUtils:读取种子文件失败“/data/user/0/ru.tablica.sputnikovyh/app_webview/variations_seed ": /data/user/0/ru.tablica.sputnikovyh/app_webview/variations_seed(没有这样的文件或目录) No such file or directory.. 你是否尝试在你的应用程序的目录文件中读取/写入 无论如何你解决了至少一半的问题,现在我至少可以通过搜索打开了,谢谢 Zain!

以上是关于单击列表项时应用程序崩溃:FATAL EXCEPTION: main, .onItemClick的主要内容,如果未能解决你的问题,请参考以下文章

单击列表视图项时检索的值

点击 Android/Java 列表视图项时,如何禁用单击声音?

当我单击列表视图的操作项时,将文本从列表视图传递到另一个活动

单击列表视图项时从 SQLite 数据库中获取行 ID

单击列表项时如何识别关联的小部件?

单击侧菜单项时如何避免刷新页面