Java 如何在recyclerView';谁的适配器?

Java 如何在recyclerView';谁的适配器?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我的onBindViewHolder中有一个setOnClick侦听器 @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { ((ViewHolder) holder).txtType.setText(object.text); ((ViewHolder) holder).checkBox.setOnClickListener

我的
onBindViewHolder中有一个
setOnClick
侦听器

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
       ((ViewHolder) holder).txtType.setText(object.text);
       ((ViewHolder) holder).checkBox.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { 
                        Toast.makeText(mContext, ""+position, Toast.LENGTH_SHORT).show();                           
                      //???.scrolltoPosition(position+1);
                    }
                });
单击后,我会将视口滚动到下一个“回收器”视图项。我在mainActivityJava中通过
recyclerView.scrollToPosition(位置)实现了这一点。但是在onBindViewHolder上的适配器类中,我不知道如何在主Java类上调用我的recyclerView

我该怎么做?

编辑: 为了简化起见,我修改了前面的代码,因为我为我的回收器使用了多视图适配器。以下是多视图适配器:

public class MultiViewTypeAdapter extends RecyclerView.Adapter {

private ArrayList<InstructionModel>dataSet;
Context mContext;
int total_types;
private LinearLayoutManager manager;

public MultiViewTypeAdapter(LinearLayoutManager manager)
{
    this.manager=manager;
}


public static class SimpleTextViewHolder extends RecyclerView.ViewHolder {

    TextView txtType;
    CardView cardView;
    CheckBox checkBox;

    public SimpleTextViewHolder(View itemView) {
        super(itemView);

        this.txtType = (TextView) itemView.findViewById(R.id.type);
        this.cardView = (CardView) itemView.findViewById(R.id.card_view);
        this.checkBox = (CheckBox) itemView.findViewById(R.id.checkBox);

    }
}
public static class TimeTextViewHolder extends RecyclerView.ViewHolder {

    TextView txtType;
    CardView cardView;
    CheckBox checkBox;

    public TimeTextViewHolder(View itemView) {
        super(itemView);

        this.txtType = (TextView) itemView.findViewById(R.id.type);
        this.cardView = (CardView) itemView.findViewById(R.id.card_view);
        this.checkBox = (CheckBox) itemView.findViewById(R.id.checkBox);
    }
}




public MultiViewTypeAdapter(ArrayList<InstructionModel> data, Context context) {
    this.dataSet = data;
    this.mContext = context;
    total_types = dataSet.size();
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view;
    switch (viewType) {
        case InstructionModel.SIMPLE_TYPE:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.simple, parent, false);
            return new SimpleTextViewHolder(view);
        case InstructionModel.TIME_TYPE:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.time, parent, false);
            return new TimeTextViewHolder(view);
    }
    return null;
}

@Override
public int getItemViewType(int position) {

    switch (dataSet.get(position).type) {
        case 0:
            return InstructionModel.SIMPLE_TYPE;
        case 1:
            return InstructionModel.TIME_TYPE;
        default:    return -1;
    }
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) {

    InstructionModel object = dataSet.get(listPosition);
    if (object != null) {
        switch (object.type) {

            case InstructionModel.SIMPLE_TYPE:

                ((SimpleTextViewHolder) holder).txtType.setText(object.text);
                break;
            case InstructionModel.TIME_TYPE:
                ((TimeTextViewHolder) holder).txtType.setText(object.text);

                break;
        }
    }



}

@Override
public int getItemCount() {
    return dataSet.size();
}
公共类MultiViewTypeAdapter扩展了RecyclerView.Adapter{ 私有ArrayListdataSet; 语境; int-total_类型; 私人直线酒店经理; 公共多视图类型适配器(LinearLayoutManager) { 这个。经理=经理; } 公共静态类SimpleTextViewHolder扩展了RecyclerView.ViewHolder{ 文本视图txtType; 卡德维尤; 复选框; 公共SimpleTextViewHolder(视图项视图){ 超级(项目视图); this.txtType=(TextView)itemView.findViewById(R.id.type); this.cardwiew=(cardwiew)itemView.findviewbyd(R.id.card\u视图); this.checkBox=(checkBox)itemviewbyd(R.id.checkBox); } } 公共静态类TimeTextViewHolder扩展了RecyclerView.ViewHolder{ 文本视图txtType; 卡德维尤; 复选框; 公共时间文本视图持有者(查看项目视图){ 超级(项目视图); this.txtType=(TextView)itemView.findViewById(R.id.type); this.cardwiew=(cardwiew)itemView.findviewbyd(R.id.card\u视图); this.checkBox=(checkBox)itemviewbyd(R.id.checkBox); } } 公共MultiViewTypeAdapter(ArrayList数据、上下文){ this.dataSet=数据; this.mContext=上下文; total_types=dataSet.size(); } @凌驾 public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){ 视图; 开关(视图类型){ 案例说明model.SIMPLE\u类型: view=LayoutInflater.from(parent.getContext()).flate(R.layout.simple,parent,false); 返回新的SimpleTextViewHolder(视图); 案例说明model.TIME\u类型: view=LayoutInflater.from(parent.getContext()).flate(R.layout.time,parent,false); 返回新的TimeTextViewHolder(视图); } 返回null; } @凌驾 public int getItemViewType(int位置){ 开关(dataSet.get(position).type){ 案例0: 返回指令model.SIMPLE\u TYPE; 案例1: 返回指令model.TIME_TYPE; 默认值:return-1; } } @凌驾 public void onBindViewHolder(final RecyclerView.ViewHolder holder,final int listPosition){ 指令模型对象=dataSet.get(listPosition); if(对象!=null){ 开关(对象类型){ 案例说明model.SIMPLE\u类型: ((SimpleTextViewHolder)holder.txtType.setText(object.text); 打破 案例说明model.TIME\u类型: ((TimeTextViewHolder)holder.txtType.setText(object.text); 打破 } } } @凌驾 public int getItemCount(){ 返回dataSet.size(); }
附言。
如果你看到一些随机的无用的东西,我正在尝试一些东西。

我认为你应该定义一个接口来通知你的父母RecyclerView做滚动操作,RecyclerView进入ViewHodler内部操作,导致耦合

通过Constructor的
布局管理器

  private int getScrollRange() {
        int scrollRange = 0;
        if (parent.getChildCount() > 0) {
            View child = parent.getChildAt(0);
            scrollRange = Math.max(0,
                    child.getHeight() - (parent.getHeight()));
        }
        return scrollRange;
    }

ScrollView parent=findViewById(R.id.scroll_Recipe_Detail);
parent.scrollTo(0,getScrollRange());
 class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
            private LinearLayoutManager manager;

            public Adapter(LinearLayoutManager manager)
            {
                this.manager=manager;
            }


        @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
           ((ViewHolder) holder).txtType.setText(object.text);
           ((ViewHolder) holder).checkBox.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) { 
                            Toast.makeText(mContext, ""+position, Toast.LENGTH_SHORT).show();                           
                          manager.scrollToPosition(position+1);
                        }
                    });
    }
类适配器扩展了RecyclerView.Adapter{
私人直线酒店经理;
公用适配器(LinearLayoutManager)
{
这个。经理=经理;
}
@凌驾
公共无效onBindViewHolder(最终RecyclerView.ViewHolder,最终整型位置){
((ViewHolder)holder.txtType.setText(object.text);
((ViewHolder)holder.checkBox.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
Toast.makeText(mContext,“+位置,Toast.LENGTH_SHORT.show();
经理职位(职位+1);
}
});
}

您可以在构造函数中传递侦听器对象,该对象通过片段或活动实现

/**
 * item click interface of adapter
 */
public interface MultiViewTypeAdapterListener {
    void onScroll(int position)
}  
此接口通过片段或活动实现

/**
     * On Scroll Implement Method from adapter listener.
     *
     * @param position
     */
    @Override
    public void onScroll(int position) {
        // Here you can call that method 
        recyclerview.scrolltoPosition(position)
    }
然后在适配器的构造函数中传递此侦听器

private void buildRecyclerView() {
  multiViewTypeAdapter = new MultiViewTypeAdapter(this);
  recyclerView.setAdapter(multiViewTypeAdapter);
}
在构造函数中,可以这样赋值

 private MultiViewTypeAdapterListener mMultiViewTypeAdapterListener;
 public OfferAdapter(MultiViewTypeAdapterListener mMultiViewTypeAdapterListener) {
        this.mMultiViewTypeAdapterListener = mMultiViewTypeAdapterListener
        }
    }
((ViewHolder) holder).checkBox.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { 
                        Toast.makeText(mContext, ""+position, Toast.LENGTH_SHORT).show();                           
                      //???.scrolltoPosition(position+1);
                        mMultiViewTypeAdapterListener.onScroll(position+1);
                    }
                });
现在,您可以通过如下方式在AnyVi上设置click listener来使用此侦听器

 private MultiViewTypeAdapterListener mMultiViewTypeAdapterListener;
 public OfferAdapter(MultiViewTypeAdapterListener mMultiViewTypeAdapterListener) {
        this.mMultiViewTypeAdapterListener = mMultiViewTypeAdapterListener
        }
    }
((ViewHolder) holder).checkBox.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { 
                        Toast.makeText(mContext, ""+position, Toast.LENGTH_SHORT).show();                           
                      //???.scrolltoPosition(position+1);
                        mMultiViewTypeAdapterListener.onScroll(position+1);
                    }
                });

它返回调用实现此方法的onItemClick方法。

如果要滚动添加的新项目,必须覆盖“OnItemAdded”。 我是这样做的:

recyclerView.apply {
        setHasFixedSize(true)
        layoutManager = MyLinearLayoutManager(this@MainActivity)
        ...
}

private class MyLinearLayoutManager(private val context: Context) :
    LinearLayoutManager(context) {

    // Force new items appear at the top
    override fun onItemsAdded(recyclerView: RecyclerView, positionStart: Int, itemCount: Int) {
        super.onItemsAdded(recyclerView, positionStart, itemCount)

        scrollToPosition(findLastVisibleItemPosition())
    }
}

在适配器中传递layoutmanager实例并使用它执行same@ApoorvSingh很抱歉,我是新手,你能告诉我怎么做吗?@Nicodiso你找到解决方案了吗?@Nicodiso请看我的答案我很久以前就解决了这个问题,但感谢这一点,可能会帮助其他开发人员。我的适配器类是这样构建的:public class Adapter extensed RecyclerView.Adapter{public static class SimpleTextViewHolder extensed RecyclerView.ViewHolder{…},我应该在哪里声明私有LinearLayoutManager管理器;public Adapter(LinearLayoutManager管理器){this.manager=manager;}?实际上,我修改了我在这里关于这个问题的代码,因为我使用了一个多视图适配器,我将添加代码的第一部分,其中包含我们所讨论的内容。在我尝试您的代码时,我遇到了以下错误java.lang.NullPointerException:尝试调用虚拟m