Java 如何将OnClickListener设置为可扩展的RecycleView

Java 如何将OnClickListener设置为可扩展的RecycleView,java,android,onclicklistener,expandablerecyclerview,Java,Android,Onclicklistener,Expandablerecyclerview,我想将OnClickListeners设置为我的可扩展回收视图中的项目。Recycleview中的每个项目都应该有一个按钮(如下所示:添加任务的+按钮和删除任务的“x”按钮) 我曾尝试从其他一些onClickListeners示例中实现它,但到目前为止没有任何效果 这是适配器: public class ExpandableAdapter extends ExpandableRecyclerViewAdapter<RoutineViewHolder, TaskViewHolder>

我想将OnClickListeners设置为我的可扩展回收视图中的项目。Recycleview中的每个项目都应该有一个按钮(如下所示:添加任务的+按钮和删除任务的“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);

    }
任务视图持有者:

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