ListView中的Android自定义ArrayAdapter,ListView onClick适用于模拟器但不适用于手机

标签 android listview android-arrayadapter

我已经为 Android 创建了一个学习助手应用程序。我使用一个自定义数组适配器,它在每一行中都有一个复选框和一个 TextView 。我的一些 ListView 是使用此自定义适配器填充的。我的 ListView 用于导航到其他 Activity ,并具有 onItemClick 监听器。

在 android studio 模拟器上,一切正常。但是,我导出了 apk 并将其安装在我的手机上,使用我的自定义适配器的 ListView 在点击时不再执行任何操作。

这是我的自定义适配器:

public class CheckboxAdapter extends BaseAdapter {
    private Context context;
    ArrayList<String[]> list = new ArrayList<>();
    Boolean completed[];

    public CheckboxAdapter(ArrayList<String[]> list,Context context) {
        super();
        this.context = context;
        this.list = list;
        completed = new Boolean[list.size()];
        for (int i = 0; i < completed.length; i++){
            if(list.get(i)[1].equalsIgnoreCase("true")){
                completed[i] = true;
            } else {
                completed[i] = false;
            }
        }
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    // Class to temporarily store the textview and checkbox in each row
    public class ViewHolder {
        public TextView nametext;
        public CheckBox tick;
    }

    // Override getView method to set custom row layout
    // Use viewHolder to get the textview and checkbox then inflate it
    // Set text to passed in list of string data
    // Set checkbox to passed in array of booleans, then disable the checkbox
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder view = null;
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        if (view == null) {
            view = new ViewHolder();
            convertView = inflater.inflate(  R.layout.checkbox_adapter, null);
            view.nametext = (TextView) convertView.findViewById(R.id.adaptertextview);
            view.tick = (CheckBox)convertView.findViewById(R.id.adaptercheckbox);
            convertView.setTag(view);
        } else {
            view = (ViewHolder) convertView.getTag();
        }
        view.tick.setTag(position);
        view.nametext.setText(list.get(position)[0]);
        view.tick.setChecked(completed[position]);
        view.tick.setEnabled(false);
        return convertView;
    }
}

及其 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <CheckBox
        android:id="@+id/adaptercheckbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/adaptertextview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

这是一个使用自定义适配器及其 onclick 函数的 ListView 示例:

        ArrayList<String[]> content = new ArrayList<String[]>();
        content.add(new String[] {"Lesson 1     Highest Mark: " + highest[0], completed[0]});
        content.add(new String[] {"Lesson 2     Highest Mark: " + highest[1], completed[1]});
        content.add(new String[] {"Lesson 3     Highest Mark: " + highest[2], completed[2]});
        content.add(new String[] {"Lesson 4     Highest Mark: " + highest[3], completed[3]});
        content.add(new String[] {"Lesson 5     Highest Mark: " + highest[4], completed[4]});
        content.add(new String[] {"Combined Quiz", "false"});
        ListView quizList = (ListView) findViewById(R.id.quizListView);
        CheckboxAdapter adapter = new CheckboxAdapter(content, this);
        quizList.setAdapter(adapter);
        quizList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                System.out.println(parent. getItemAtPosition(position));
                switch (position) {
                    case 0: Intent i0 = new Intent(Quiz.this, Quiz1.class);
                        startActivity(i0);
                        break;
                    case 1: Intent i1 = new Intent(Quiz.this, Quiz2.class);
                        startActivity(i1);
                        break;
                    case 2: Intent i2 = new Intent(Quiz.this, Quiz3.class);
                        startActivity(i2);
                        break;
                    case 3: Intent i3 = new Intent(Quiz.this, Quiz4.class);
                        startActivity(i3);
                        break;
                    case 4: Intent i4 = new Intent(Quiz.this, Quiz5.class);
                        startActivity(i4);
                        break;
                    case 5: Intent i5 = new Intent(Quiz.this, QuizCombined.class);
                        startActivity(i5);
                        break;
                    default: return;
                }
            }
        });

知道为什么这只适用于 android studio 模拟器吗?我试过两台设备和 Memu 模拟器,但它们都不起作用,只有 android studio 模拟器。

编辑:使用上述 ListView 的 Activity 的 xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".Quiz">

        <TextView
            android:id="@+id/quizTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp"
            android:layout_marginTop="56dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/quizTextView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp"
            android:layout_marginTop="10dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/quizTextView" />

        <ListView
            android:id="@+id/quizListView"
            android:layout_width="368dp"
            android:layout_height="493dp"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp"
            android:layout_marginTop="10dp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/quizTextView2" />

    </android.support.constraint.ConstraintLayout>

    <include
        layout="@layout/app_bar_main_menu"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main_menu"
        app:menu="@menu/activity_main_menu_drawer" />

</android.support.v4.widget.DrawerLayout>

编辑:我将该项目复制到我的笔记本电脑并在那里的模拟器中运行它,但没有成功。似乎它只适用于我的电脑

最佳答案

删除重复的

xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"

来自 android.support.constraint.ConstraintLayout

很可能透明布局重叠并阻止点击...

inspect view boundaries 按钮在图 block 中被删除;

认为它也可以在开发者设置中使用。

关于ListView中的Android自定义ArrayAdapter,ListView onClick适用于模拟器但不适用于手机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52959732/

相关文章:

android - 如何在主线程中将 ListView、ArrayList、ArrayAdapter 和 notifyDataSetChanged 与可运行对象和消息处理程序一起使用

android - Retrofit找不到主机

java - Android 日历 View 更改文本颜色

android - WebView 在 Android 模拟器中不工作

java - 用于接收短信的应用程序第一次运行时工作正常,第二次运行时所有消息均不显示

WPF Listview 3 个差异列表的不同替代行颜色..?

java - 在 libgdx 中截图

android - 为什么 ListView 每 6 个项目重复一次?

java - 在android中的 ListView 的每一行添加一个按钮?

Android - 尝试将项目添加到数据库时应用程序崩溃