繁体   English   中英

如何在 recyclerView 的适配器中调用 scrollToPosition(position)?

[英]How to call scrollToPosition(position) inside recyclerView's adapter?

我的setOnClick有一个setOnClick侦听onBindViewHolder

@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);
                    }
                });

单击时,我会将视口滚动到下一个回收站视图项。 我已经通过recyclerView.scrollToPosition(position);在我的 MainActivity java 中完成了这项工作recyclerView.scrollToPosition(position); . 但是在 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();
}

PS如果你看到一些随机无用的东西,我正在尝试一些东西。

使用构造函数传递LayoutManger

 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做滚动操作,把RecyclerView放到ViewHodler里面操作,导致耦合

您可以在构造函数中传递一个侦听器对象,该对象由 Fragment OR Activity 实现。

/**
 * item click interface of adapter
 */
public interface MultiViewTypeAdapterListener {
    void onScroll(int position)
}  

该接口由 Fragment OR Activity 实现

/**
     * 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
        }
    }

现在您可以通过在 anyViwe 上设置单击侦听器来使用此侦听器

((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 方法。

  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());

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

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())
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM