【问题标题】:in Android Studio the Button in ListView does not work在 Android Studio 中,ListView 中的按钮不起作用
【发布时间】:2020-12-12 15:15:07
【问题描述】:

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

这是购物清单的活动

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

<?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>

【问题讨论】:

  • 你的意思是viewHolder.button.setOnClickListener...没有被调用? (位置应该是最终的,因为它是从内部类调用的)
  • 在哪里创建MyListAdapter 对象?您的代码似乎没有使用MyListAdapter
  • @MatiasLappalainen 是的`viewHolder.button.setOnClickListener...` 它没有被调用,我尝试将位置分配给final,但按钮仍然没有被调用,但我会解决这个问题。关于我的列表适配器MyListAdapter 我真的不知道如何正确使用它,我尝试将MyListAdapter 放入onCreate() 但列表没有显示,但删除它后列表显示但里面的按钮列表不会被调用。
  • 目前您没有使用MyListAdapter,因为该按钮什么也不做。我建议您查看arrayAdapters 或查找教程。目前您正在使用 arrayAdapter 类构造函数来创建 ArrayAdapter。这在某些情况下有效,但在这里,当您想要添加像 OnClickListeners 这样的自定义功能时,您想要像您所做的那样创建自己的 CustomAdapter。所以你在做正确的事,但没有使用它。
  • 非常感谢@MatiasLappalainen 我将查看文档并尝试理解arrayAdapters。我遵循了 2 或 3 个关于如何制作这个 Listview 的教程。你能给我一些关于如何使用我拥有的适配器的提示吗?因为当我使用它时,列表中的项目消失了。再次感谢您的 cmets

标签: android listview


【解决方案1】:

您的MyListAdapter 可以正常工作,除了int position 应该是final int position 因为button 从内部类调用它。

问题是您没有使用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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多