Java 如何将OnClickListener设置为可扩展的RecycleView
我想将OnClickListeners设置为我的可扩展回收视图中的项目。Recycleview中的每个项目都应该有一个按钮(如下所示:添加任务的+按钮和删除任务的“x”按钮) 我曾尝试从其他一些onClickListeners示例中实现它,但到目前为止没有任何效果 这是适配器:Java 如何将OnClickListener设置为可扩展的RecycleView,java,android,onclicklistener,expandablerecyclerview,Java,Android,Onclicklistener,Expandablerecyclerview,我想将OnClickListeners设置为我的可扩展回收视图中的项目。Recycleview中的每个项目都应该有一个按钮(如下所示:添加任务的+按钮和删除任务的“x”按钮) 我曾尝试从其他一些onClickListeners示例中实现它,但到目前为止没有任何效果 这是适配器: public class ExpandableAdapter extends ExpandableRecyclerViewAdapter<RoutineViewHolder, TaskViewHolder>
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);
}
任务视图持有者:
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());
}
}
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);
}
}
如您所见,我有两个视图持有者:RoutineViewHolder和TaskViewHolder。我对OnClickListener应该设置在哪里以及如何设置感到非常困惑,因为我希望它在“例程”和“任务”中表现不同,因为它们有不同的按钮
“任务”应具有+按钮,以便在其下方添加任务
每个任务都应该有一个X按钮来删除特定的任务
expandable recycleview由另外两个“任务”类别组成。您是否尝试从活动中调用expandable Adapter对象的setChildClickListener 看看这个:
ExpandableAdapter adapter=new ExpandableAdapter(myExpandableGroupList);
adapter.setChildClickListener(new OnCheckChildClickListener() {
@Override
public void onCheckChildCLick(View v, boolean checked, CheckedExpandableGroup group,int childIndex) {
}
});
我希望这能对您有所帮助。我更喜欢一个解决方案,在这个解决方案中,我可以从某个更高级别(如活动)侦听所有这些回调,在该级别中,我可以更改数据对象并刷新RecyclerView,根据回调保持同步。(如果您扩展此功能,这最终将是您所需要的。) 我实现了您的代码,并进行了一些修改以获得预期的结果。 对于此解决方案:
- 我创建了一个接口来获取回调
- 在添加时单击例程
- 在删除时单击任务
- 检查时任务状态已更改
- 使我的活动实现该接口并将其传递给适配器
- 适配器将其传递给ViewHolder
- ViewHolder将在单击时调用所需的函数
- 在回拨中:
- 对于添加:您可以知道单击了哪个例程
- 对于删除:您可以知道父例程、任务的子索引和任务
- 对于检查更改:您可以了解父例程、任务的子索引、任务和新检查状态
代码 1.添加新文件
ListActionListener.java
这是接口
公共接口ListActionListener{
//知道在给定例程上单击了add
已单击的任务无效(例行程序);
//知道在给定任务上单击了删除。
void onDeleteTaskClicked(例程、任务、int索引);
//在给定任务上单击“知道”复选框(具有新的选中状态)
void onTaskCheckChanged(例程、任务、int索引、布尔值选中);
}
2.使您的活动实现此接口<代码>ExpandableListActivity.java
这是我在截图中看到的示例活动
公共类ExpandableListActivity扩展AppCompatActivity实现ListActionListener{
可扩展适配器;
回收视图回收视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity可扩展列表);
recyclerView=findViewById(R.id.recyclerView);
loadList();
}
私有void加载列表(){
列表例程=getDummyRoutineList();
适配器=新的可扩展适配器(例程,此);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
recyclerView.setAdapter(适配器);
}
私有列表getDummyRoutineList(){
列表=新的ArrayList();
任务rt1=新任务(“R1任务1”,1);
任务rt2=新任务(“R1任务S2”,0);
任务rt3=新任务(“R1任务S3”,1);
任务rt4=新任务(“R1任务4”,0);
任务rt5=新任务(“R1任务5”,0);
List r1Tasks=new ArrayList();
r1Tasks.add(rt1);
r1Tasks.add(rt2);
r1Tasks.add(rt3);
r1Tasks.add(rt4);
r1Tasks.add(rt5);
例程r1=新例程(“例程1”,r1任务);
任务r2t1=新任务(“R2任务1”,1);
任务r2t2=新任务(“R2任务S2”,0);
任务r2t3=新任务(“R2任务S3”,1);
任务r2t4=新任务(“R2任务4”,0);
任务r2t5=新任务(“R2任务5”,1);
List r2Tasks=new ArrayList();
r2Tasks.add(r2t1);
r2Tasks.add(r2t2);
r2Tasks.add(r2t3);
r2Tasks.add(r2t4);
r2Tasks.add(r2t5);
例行程序r2=新例行程序(“例行程序2”,r2任务);
列表。添加(r1);
列表。添加(r2);
退货清单;
}
@凌驾
已单击AddTask上的公共无效(例程){
Toast.makeText(这是“单击添加时”,Toast.LENGTH_SHORT.show();
}
@凌驾
已单击公共void OnDeleteTask(例程、任务、整数索引){
Toast.makeText(这是“单击删除时”,Toast.LENGTH_SHORT.show();
}
@凌驾
已更改公用void onTaskCheckChanged(例程、任务、int索引、布尔值已选中){
Toast.makeText(该“On Check”已更改:“+checked,Toast.LENGTH_SHORT).show();
}
}
3.将“X”按钮添加到任务行布局
这是我的示例XML文件,您的XML可能看起来不同。主要是添加删除按钮
4.将“+”按钮添加到例程布局文件
5.更新适配器以接受ListActionListener
公共类ExpandableAdapter扩展了ExpandableRecycleServiceAdapter{
ListActionListener ListActionListener;
public ExpandableAdapter(ListOk)两个视图持有者有不同的责任。在这两个视图中都应用OnClickListener。例如,对于+clicklistener,如果第一个适用,那么它将适用于+和X。您花费了太多的时间,并在这些细节上分享了您的知识!再次感谢@HBB20