- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将 OnClickListeners 设置为可扩展回收 View 中的项目。 Recycleview 中的每个项目都应该有一个按钮(像这样 /image/cuQWk.jpg :一个 + 按钮用于添加任务,每个任务的“x”按钮用于删除它)
我尝试从 onClickListeners 的其他一些示例中实现它,但到目前为止没有任何效果
这是适配器:
public class ExpandableAdapter extends ExpandableRecyclerViewAdapter<RoutineViewHolder, TaskViewHolder> {
public ExpandableAdapter(List<? extends ExpandableGroup> groups) {
super(groups);
}
@Override
public RoutineViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.expandable_recyclerview_routine, parent, false);
return new RoutineViewHolder(v);
}
@Override
public TaskViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.expandable_recyclerview_task, parent, false);
return new TaskViewHolder(v);
}
@Override
public void onBindChildViewHolder(TaskViewHolder holder, int flatPosition, ExpandableGroup group, int childIndex) {
final Tasks tasks = (Tasks) group.getItems().get(childIndex);
holder.bind(tasks);
}
@Override
public void onBindGroupViewHolder(RoutineViewHolder holder, int flatPosition, ExpandableGroup group) {
final Routine routine = (Routine) group;
holder.bind(routine);
}
例程ViewHolder:
import com.thoughtbot.expandablerecyclerview.viewholders.GroupViewHolder;
public class RoutineViewHolder extends GroupViewHolder implements View.OnClickListener {
private TextView mTextView;
public RoutineViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.exp_routine);
itemView.setOnClickListener(this);
}
public void bind(Routine routine){
mTextView.setText(routine.getTitle());
}
}
任务 View 持有者:
public class TaskViewHolder extends ChildViewHolder {
private TextView mTextView;
private CheckBox mCheckBox;
private Boolean checkVal;
public TaskViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.exp_task);
mCheckBox=itemView.findViewById(R.id.exp_task_checkbox);
}
public void bind(Tasks tasks) {
mTextView.setText(tasks.name);
checkVal=((tasks.checkBox==1)?Boolean.TRUE:Boolean.FALSE);
mCheckBox.setChecked(checkVal);
}
}
如您所见,我有 2 个 ViewHolder:RoutineViewHolder 和 TaskViewHolder。我对应该在哪里以及如何设置 OnClickListener 感到非常困惑,因为我希望它对“例程”和“任务”有不同的行为,因为它们有不同的按钮。
“任务”应该有 + 按钮以在其下方添加任务每个任务都应该有一个 X 按钮来删除该特定任务
可扩展的回收 View 由另外 2 个“任务”类别组成。
最佳答案
我更喜欢一个解决方案,我可以从更高级别(例如 Activity)监听所有这些回调,在其中我可以更改数据对象并刷新 RecyclerView,以根据回调保持同步。 (如果您扩展它,这最终将是您所需要的。)
对于此解决方案:
代码
ListActionListener.java
这是界面。
public interface ListActionListener {
// Know add was clicked on given routine
void onAddTaskClicked(Routine routine);
// Know delete was clicked on given task.
void onDeleteTaskClicked(Routine routine, Tasks task, int index);
// Know checkbox clicked on given task (with new checked status)
void onTaskCheckChanged(Routine routine, Tasks task, int index, boolean checked);
}
ExpandableListActivity.java
这是您在屏幕截图中看到的我的示例 Activity 。
public class ExpandableListActivity extends AppCompatActivity implements ListActionListener{
ExpandableAdapter adapter;
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_expandable_list);
recyclerView = findViewById(R.id.recyclerView);
loadList();
}
private void loadList() {
List<Routine> routines = getDummyRoutineList();
adapter = new ExpandableAdapter(routines, this);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
}
private List<Routine> getDummyRoutineList() {
List<Routine> list = new ArrayList<Routine>();
Tasks rt1 = new Tasks("R1 Tasks1", 1);
Tasks rt2 = new Tasks("R1 Tasks2", 0);
Tasks rt3 = new Tasks("R1 Tasks3", 1);
Tasks rt4 = new Tasks("R1 Tasks4", 0);
Tasks rt5 = new Tasks("R1 Tasks5", 0);
List<Tasks> r1Tasks = new ArrayList<>();
r1Tasks.add(rt1);
r1Tasks.add(rt2);
r1Tasks.add(rt3);
r1Tasks.add(rt4);
r1Tasks.add(rt5);
Routine r1 = new Routine("Routine 1", r1Tasks);
Tasks r2t1 = new Tasks("R2 Tasks1", 1);
Tasks r2t2 = new Tasks("R2 Tasks2", 0);
Tasks r2t3 = new Tasks("R2 Tasks3", 1);
Tasks r2t4 = new Tasks("R2 Tasks4", 0);
Tasks r2t5 = new Tasks("R2 Tasks5", 1);
List<Tasks> r2Tasks = new ArrayList<>();
r2Tasks.add(r2t1);
r2Tasks.add(r2t2);
r2Tasks.add(r2t3);
r2Tasks.add(r2t4);
r2Tasks.add(r2t5);
Routine r2 = new Routine("Routine 2", r2Tasks);
list.add(r1);
list.add(r2);
return list;
}
@Override
public void onAddTaskClicked(Routine routine) {
Toast.makeText(this, "On Add Clicked", Toast.LENGTH_SHORT).show();
}
@Override
public void onDeleteTaskClicked(Routine routine, Tasks task, int index) {
Toast.makeText(this, "On Delete Clicked", Toast.LENGTH_SHORT).show();
}
@Override
public void onTaskCheckChanged(Routine routine, Tasks task, int index, boolean checked) {
Toast.makeText(this, "On Check changed:"+checked, Toast.LENGTH_SHORT).show();
}
}
这是我的示例 XML 文件,您的 XML 可能看起来有所不同。主要是添加删除按钮。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="8dp"
>
<Button
android:id="@+id/btn_delete"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:text="X"
/>
<CheckBox
android:id="@+id/exp_task_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
/>
<TextView
android:id="@+id/exp_task"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/btn_delete"
android:layout_toRightOf="@+id/exp_task_checkbox"
/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="8dp"
>
<Button
android:id="@+id/btn_add"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:text="+"
/>
<TextView
android:id="@+id/exp_routine"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/btn_delete"
android:layout_toRightOf="@+id/exp_task_checkbox"
/>
</RelativeLayout>
public class ExpandableAdapter extends ExpandableRecyclerViewAdapter<RoutineViewHolder, TaskViewHolder> {
ListActionListener listActionListener;
public ExpandableAdapter(List<? extends ExpandableGroup> groups, ListActionListener listActionListener) {
super(groups);
this.listActionListener = listActionListener;
}
@Override
public RoutineViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.expandable_recyclerview_routine, parent, false);
return new RoutineViewHolder(v);
}
@Override
public TaskViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.expandable_recyclerview_task, parent, false);
return new TaskViewHolder(v);
}
@Override
public void onBindChildViewHolder(TaskViewHolder holder, int flatPosition, ExpandableGroup group, int childIndex) {
final Tasks tasks = (Tasks) group.getItems().get(childIndex);
holder.bind((Routine)group, childIndex, tasks, listActionListener);
}
@Override
public void onBindGroupViewHolder(RoutineViewHolder holder, int flatPosition, ExpandableGroup group) {
final Routine routine = (Routine) group;
holder.bind(routine, listActionListener);
}
}
TaskViewHolder.java
接受监听器并调用回调
public class TaskViewHolder extends ChildViewHolder {
private TextView mTextView;
private CheckBox mCheckBox;
private Boolean checkVal;
private Button btnDelete;
public TaskViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.exp_task);
mCheckBox=itemView.findViewById(R.id.exp_task_checkbox);
btnDelete = itemView.findViewById(R.id.btn_delete);
}
public void bind(final Routine parentRoutine, final int childIndex, final Tasks tasks, final ListActionListener listActionListener) {
mTextView.setText(tasks.name);
checkVal=((tasks.checkBox==1)?Boolean.TRUE:Boolean.FALSE);
mCheckBox.setChecked(checkVal);
//add delete button click
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listActionListener.onDeleteTaskClicked(parentRoutine, tasks, childIndex);
}
});
mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
//to avoid initial call back
if(checked != checkVal) {
listActionListener.onTaskCheckChanged(parentRoutine, tasks, childIndex, checked);
checkVal = checked;
}
}
});
}
}
RoutineViewHolder.java
接受监听器并调用回调。
public class RoutineViewHolder extends GroupViewHolder implements View.OnClickListener {
private TextView mTextView;
private Button btnAdd;
public RoutineViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.exp_routine);
btnAdd = itemView.findViewById(R.id.btn_add);
itemView.setOnClickListener(this);
}
public void bind(final Routine routine, final ListActionListener listActionListener) {
mTextView.setText(routine.getTitle());
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listActionListener.onAddTaskClicked(routine);
}
});
}
}
宾果游戏....运行代码...:)
关于java - 如何将 OnClickListener 设置为 Expandable RecycleView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250963/
我已将 RecycleView 添加到我的 XML 中,如下所示: 我在 build.gradle 中的依赖项定义如下: dependencies { implementation
我正在尝试做一件简单的事情,它将所有图像从外部存储中获取到回收 View 并显示它们。 我的问题是,出于某种原因,我收到了 null,但我不知道为什么。我成功地将所有图像放入字符串数组列表中。然后在
我正在使用 this处理我的图书馆 RecycleView添加项目。我有一个 ImageView 的布局和一个类(class)。我有一个对象列表,我想将它们添加到 RecycleView . 基本上是
我正在尝试为我的应用实现搜索过滤器,但我不知道该怎么做。我看到了一个问题 this one here但这只会让我更加困惑。这就是我到目前为止所做的:我在我的主要 Activity 中这样调用 frag
我有这样的布局 我希望 admob View 占用空间,然后所有剩余的 View 都应由 recycleview 占用。发生的事情是
我正在从 Recyclerview 获取数据 我正在我的应用程序中添加 searchview 过滤器,但是当我搜索大写和小写文本时没有找到结果我认为可能会导致字符串出现问题,请帮助我解决这个问题!!
我已经为 RecycleViews 构建了一个自定义渲染器。 我一直遇到一个问题,我想不出可能的解决办法,就在这里。 每当用户滚动 RecycleView 时,屏幕上显示的下一个项目就会乱序显示,就好
我正在尝试创建一个简单的考勤应用程序。 程序启动时,所有标签都在取消选择列表中 预期行为:选择任何标签时,数据将移动到所选列表,现在所选标签位于连接列表的末尾。然后 RecycleView 刷新以显示
我通过 Web 服务从服务器获取数据并在回收 View 中显示。每个请求我从服务器获取 5 个项目。我调试我的代码并检查当我滚动到 recycleview 的末尾时,新数据正在从服务器获取,但它没有添
更新: 实际问题出在 CoordinatorLayout 而不是 RecycleView。 我没有使用 RecycleView,而是在 ScrollView 中尝试了 TextView,这是同样的问题
我有一个带有 CardView 的 Recycleview,我为此实现了一个滑动 handle 选项。当用户向右滑动卡片时需要删除。问题是 Action 非常敏感——当你点击或稍微拖动卡片时,它就会执
我在 LinearLayout 中创建了一个 RecycleView 组件以及其他一些组件。问题是每当我单击 RecycleView 组件中的元素时,它应该在控制台中创建一个 TAG,但事实并非如此。
我正在尝试实现类似于上图的布局将 RecyclerView 与 GridLayoutManager 结合使用,我尝试根据位置设置 setSpanSizeLookup,但无法模仿上面的设计。 有人可以帮
问题来了:我创建了世界上最简单的 RecyclerView,但它只显示第一项。我不明白为什么。感谢您的帮助。 item_layout.xml activity_main.xml
这是我的回收 View 适配器 CategoryAdapter类 public class CategoryRAdapter extends RecyclerView.Adapter { privat
摘要 我在 RecycleView 中有一个 CardView,带有一个播放或停止歌曲的按钮,并且一次只能播放一首歌曲。因此,当我单击其中一个按钮时,所有其他按钮都应该有一个“播放”图标,而单击的按钮
我正在创建一个应用程序,我想在其中使用改造调用 API。并在回收查看器中显示对象。当我尝试使用调用 API 并将对象放入回收查看器的方法时出现错误。 下面是寻呼机适配器的代码。 public clas
我有一个使用 ViewPager 的三选项卡界面设置。在第三个选项卡中,我有一个 CardView,它可以展开/缩回 onclick 以显示更多信息。 CardView 内部是一个 RecyclerV
我正在尝试突出显示一个列表,例如当用户单击一行时,它的背景颜色会发生变化。该应用程序运行良好,但是当我上下滚动列表时,突出显示一行时,其他行也会突然突出显示。以下是显示此行为的测试应用(代码基于 ht
我使用水平 RecyclerView,我的列表项之间的边距是恒定的,我想增加列表项间距,我尝试增加 layout_margin 但没有变化. 下面是我的列表项布局
我是一名优秀的程序员,十分优秀!