在 Android Studio 中,ListView 中的按钮不起作用

in Android Studio the Button in ListView does not work

我正在创建类似于 listonic 应用程序的购物清单,但我卡在了 listView 中,我的 listView 中的按钮无法读取点击次数,但 OnItemClickListener 运行良好。 objective 是用户可以保存多个购物清单,例如杂货清单、自助清单等。我到处搜索但没有找到有用的东西。

这是购物清单activity

private ArrayList<String> data = new ArrayList<String>();
    private FloatingActionButton addList;
    private ListView listView;
    private TextView nList_name;

    private DatabaseHelper dbHelper;
    ArrayAdapter<String> mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_lists);

        dbHelper = new DatabaseHelper(this);
        listView = findViewById(R.id.list_view);
        addList = findViewById(R.id.add_list);

        loadTaskList();

        addList.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                add_item();
            }
        });

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                Toast.makeText(MyListsActivity.this, "list num "+position, Toast.LENGTH_SHORT).show();
            }
        });
    }

    private class MyListAdapter extends ArrayAdapter<String>
    {
        private final int layout;

        public MyListAdapter(@NonNull Context context, int resource, @NonNull List<String> objects) {
            super(context, resource, objects);
            layout = resource;
        }

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

            ViewHolder viewHolder;
            final int pos = position;

            if (convertView == null)
            {
                LayoutInflater inflater = LayoutInflater.from(getContext());
                convertView = inflater.inflate(layout, parent, false);
                viewHolder = new ViewHolder();
                viewHolder.thumbnail = convertView.findViewById(R.id.list_item_thumbnail);
                viewHolder.title = convertView.findViewById(R.id.list_item_text);
                viewHolder.button = convertView.findViewById(R.id.list_item_btn);
            }
            else
            {
                viewHolder = (ViewHolder) convertView.getTag();
            }

            viewHolder.title.setText(getItem(position));
            viewHolder.button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(MyListsActivity.this, "btn at row "+position, Toast.LENGTH_SHORT).show();
                }
            });

            convertView.setTag(viewHolder);
            return convertView;
        }

    }

    public static class ViewHolder
    {
        ImageView thumbnail;
        TextView title;
        Button button;
    }

    private void add_item()
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(MyListsActivity.this);
        builder.setTitle("Add new list");

        View v = LayoutInflater.from(MyListsActivity.this).inflate(R.layout.shop_list_dialog_item, null, false);
        builder.setView(v);
        TextInputEditText nList_name_edit_txt = v.findViewById(R.id.list_name_edit_txt);
        TextInputLayout nList_name_layout = v.findViewById(R.id.list_name_layout);
        builder.setPositiveButton("CREATE", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i){}
        }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {dialogInterface.cancel();}
        });

        AlertDialog dialog = builder.create();
        dialog.show();

        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view)
            {
                String task = String.valueOf(nList_name_edit_txt.getText()).trim();
                if (!TextUtils.isEmpty(nList_name_edit_txt.getText()))
                {
                    dbHelper.insertNewTask(task);
                    loadTaskList();
                    dialog.cancel();
                }
                else{nList_name_layout.setError("Name your list");}

            }
        });

    }
    private void loadTaskList() {
        ArrayList<String> taskList = dbHelper.getTaskList();
        if(mAdapter==null){
            mAdapter = new ArrayAdapter<String>(this, R.layout.list_wrapper_item, R.id.list_item_text, taskList);
            listView.setAdapter(mAdapter);
        }
        else{
            mAdapter.clear();
            mAdapter.addAll(taskList);
            mAdapter.notifyDataSetChanged();
        }
    }

}

这是购物清单 xml activity

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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=".MyListsActivity">

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/add_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="30dp"
        android:layout_marginBottom="30dp"
        android:clickable="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:srcCompat="@drawable/ic_baseline_add_24" />

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" >

    </ListView>

</androidx.constraintlayout.widget.ConstraintLayout>

这是适配器的布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="wrap_content"
    android:descendantFocusability="blocksDescendants">

    <ImageView
        android:id="@+id/list_item_thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="30dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ic_baseline_image_24" />

    <TextView
        android:id="@+id/list_item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="30dp"
        android:textColor="@color/youtube"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@+id/list_item_thumbnail"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/list_item_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="30dp"
        android:layout_marginBottom="30dp"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

你的 MyListAdapter 正常工作,除了 int position 应该是 final int position 因为 button 从内部调用它 class.

问题是您没有使用 MyListAdapter。所以改变

mAdapter = new ArrayAdapter<String>(this, R.layout.list_wrapper_item, R.id.list_item_text, taskList);        

mAdapter = new MyListAdapter(this, R.layout.list_wrapper_item, taskList);