按钮不会在listview adatper内部单击

时间:2018-10-03 03:14:30

标签: android listview

Here是我的布局图片。我希望能够单击左侧的播放按钮。我目前只能单击最后一行上的按钮。我尝试单击其他行,但只有最后一行会响应单击。以下是我的源代码:

custom_list_item_layout:

            <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout 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"
            android:visibility="visible"
            android:descendantFocusability="blocksDescendants">
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_marginTop="15dp"
                android:layout_marginBottom="15dp">
            <TextView
                android:id="@+id/time_view_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:layout_marginLeft="25dp"
                android:layout_toRightOf="@+id/play_pause_id"
                android:text="TextView"
                android:textColor="@color/white"
                android:textSize="30sp" />

            <TextView
                android:id="@+id/task_view_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:layout_alignParentRight="true"
                android:layout_marginLeft="25dp"
                android:layout_marginRight="25dp"
                android:text="TextView"
                android:textColor="@color/white"
                android:textSize="18sp"

                />

            <ImageButton
                android:id="@+id/play_pause_id"
                android:layout_width="45dp"
                android:layout_height="45dp"
                android:layout_centerInParent="true"
                android:layout_alignParentLeft="true"
                android:layout_marginLeft="15dp"
                android:background="@null"
                android:scaleType="fitXY"
                android:src="@drawable/play_btn"

                />

        </RelativeLayout>



        </RelativeLayout>

自定义列表适配器类:

        package com.example.study.studytimer;

    import android.content.Context;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.EditText;
    import android.widget.ImageButton;
    import android.widget.TextView;

    import java.util.List;

    public class CustomListAdapter extends ArrayAdapter<Task>{
        Context mCtx;
        int resource;
        List<Task> taskList;
        ImageButton playSelect;
        private boolean isPressed = false;

        public CustomListAdapter(Context mCtx, int resource, List<Task> taskList) {
            super(mCtx, resource, taskList);
            this.mCtx = mCtx;
            this.resource = resource;
            this.taskList = taskList;

        }

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            LayoutInflater inflater = LayoutInflater.from(mCtx);


            View view = inflater.inflate(resource, null);
            TextView tvTask = view.findViewById(R.id.task_view_id);
            TextView tvHour = view.findViewById(R.id.time_view_id);
            playSelect = view.findViewById(R.id.play_pause_id);


            playSelect.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    isPressed = !isPressed;
                    if (isPressed) {
                        playSelect.setImageResource(R.drawable.pause_btn);
                    } else {
                        playSelect.setImageResource(R.drawable.play_btn);
                    }
                }
            });

            Task task = taskList.get(position);
            Log.d("getViewCustomList", "getView: " + task.getTask_name());
            tvTask.setText(task.getTask_name());
            tvHour.setText(task.getNum_hours());

            return view;
        }

    }

3 个答案:

答案 0 :(得分:0)

使用“ v”引用代替“ playSelect”引用来更改可绘制对象。

if (isPressed) {
v.setImageResource(R.drawable.pause_btn);
} else {
v.setImageResource(R.drawable.play_btn);
}

您还需要在每个项目条目中存储isPressed的值。您可以在按钮上设置标签,也可以创建arraylist来存储值。

答案 1 :(得分:0)

尝试在playSelect方法内为每个项目定义getView

            ImageButton playSelect = view.findViewById(R.id.play_pause_id);

每个项目的侦听器必须具有不同的目标。

答案 2 :(得分:0)

我尝试了您的代码,效果很好。所有行都对单击做出响应,但是我发现您已将isPressed贴标为全局变量,但我发现的唯一问题是,您应该将最后一个元素数组用作局部变量,以便使其正常工作。如果这不是您想要的内容,请在注释中写。您可以检查以下示例:

 final boolean[] isPressed = {false};
        playSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isPressed[0] = !isPressed[0];
                if (isPressed[0]) {
                    Toast.makeText(mCtx, "Pressed", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(mCtx, "Not Pressed", Toast.LENGTH_SHORT).show();
                }
            }
        });

用您的操作替换Toast