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;
}
}
答案 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
。