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