Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决适配器中的位置问题?使用firebase作为后端_Java_Android_Firebase_Android Recyclerview_Adapter - Fatal编程技术网

Java 如何解决适配器中的位置问题?使用firebase作为后端

Java 如何解决适配器中的位置问题?使用firebase作为后端,java,android,firebase,android-recyclerview,adapter,Java,Android,Firebase,Android Recyclerview,Adapter,我正在创建一个以firebase为后端的应用程序。我正在为不同的活动使用相同的适配器,现在它工作正常,但位置不匹配。例如:位置0的输出显示在位置1,位置1的输出显示在位置2,依此类推。。如何解决这个问题,问题在于输出的位置 Adapter: public class FrontlistAdapter extends FirebaseRecyclerAdapter<Gamedata, FrontlistAdapter.ViewHolder> { private

我正在创建一个以firebase为后端的应用程序。我正在为不同的活动使用相同的适配器,现在它工作正常,但位置不匹配。例如:位置0的输出显示在位置1,位置1的输出显示在位置2,依此类推。。如何解决这个问题,问题在于输出的位置

 Adapter:
    public class FrontlistAdapter extends FirebaseRecyclerAdapter<Gamedata, FrontlistAdapter.ViewHolder> {
        private static final String TAG = "GameAdapter";
        Context mContext;
    int positions;
    public FrontlistAdapter(@NonNull FirebaseRecyclerOptions<Gamedata> options, Context context) {
            super(options);
            mContext = context;
        }
     @Override
        protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull Gamedata model) {
            holder.name.setText(model.getName());
            holder.address.setText(model.getAddress());
            //Picasso.get().load(model.getFrontcover()).into(holder.Frontcover);
            Glide.with(mContext).load(model.getFrontcover()).into(holder.Frontcover);
            positions = position; //<-- here I'm having positions but output shows different for each positions
           
        }
    
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            View v = layoutInflater.inflate(R.layout.gamerow,parent,false);
            ViewHolder viewHolder = new ViewHolder(v);
            return viewHolder;
        }
    
    
        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    
                ImageView Frontcover;
                TextView name;
                TextView address;
            View v;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
    
                Frontcover = (ImageView)itemView.findViewById(R.id.frontcover);
                name = (TextView)itemView.findViewById(R.id.frontname);
                address=(TextView)itemView.findViewById(R.id.frontaddress);
                v = itemView;
                itemView.setClickable(true);
                itemView.setOnClickListener((View.OnClickListener) this);
            }
    
            @Override
            public void onClick(View v) {
                String className = mContext.getClass().getSimpleName();
                Intent intent = null;
                switch (className) {
                    case "GameActivity":
                        intent =  new Intent(mContext, Center_details.class);
                        intent.putExtra("User", getRef(positions).getKey());
                        break;
                    case "KidsActivity":
                        intent = new Intent(mContext,AllCenterDetails.class);
                        intent.putExtra("Kids",getRef(positions).getKey());
                        break;
                }
                mContext.startActivity(intent);
            }
        }
    }
适配器:
公共类FrontlistAdapter扩展了FirebaseRecyclerAdapter{
私有静态最终字符串TAG=“GameAdapter”;
语境;
int位置;
公共FrontlistAdapter(@NonNull FirebaseRecyclerOptions选项,上下文){
超级(期权);
mContext=上下文;
}
@凌驾
受保护的无效onBindViewHolder(@NonNull ViewHolder,int位置,@NonNull Gamedata模型){
holder.name.setText(model.getName());
holder.address.setText(model.getAddress());
//毕加索.get().load(model.getFrontcover())。装入(holder.Frontcover)中;
使用(mContext)将(model.getFrontcover())加载到(holder.Frontcover)中;
职位=职位//
这是您的问题。您正在为适配器中的所有内容设置一个全局位置


无论您当前在哪里使用
位置
,您都应该调用
视图持有者

,首先要做的是创建如下界面

  public interface ClickListner {
   void onClick(View view, int position);
  }
然后在活动中,像这样创建接口的对象,并将其与其他数据一起传递给适配器

         ClickListner listener = ClickListner();
         FrontlistAdapter customAdapter = new 
         FrontlistAdapter(AcceptedOrdersActivity.this,listener);
         riderView.setAdapter(customAdapter);
将此复制到onCreate外部,并将其复制到

        private ClickListner ClickListner() {
        ClickListner listener = new ClickListner() {
        @Override
        public void onClick(View view, int position) {


            int tag = (int) view.getTag();

            if(tag == 0)
            {
                //Intent here
            }

        }
    };

    return listener;
}
现在您的适配器应该是这个

      public class FrontlistAdapter extends 
      RecyclerView.Adapter<FrontlistAdapter .DataObjectHolder>{

ClickListner listenr;
Context context;

public FrontlistAdapter (Context context,ClickListner listenr) {
    this.context = context;
    this.listenr = listenr;
}

public static class DataObjectHolder extends RecyclerView.ViewHolder {


    Context context;

    public DataObjectHolder(View itemView,ClickListner listenr) {
        super(itemView);

        this.listenr = listenr;
         Frontcover = (ImageView)itemView.findViewById(R.id.frontcover);
        name = (TextView)itemView.findViewById(R.id.frontname);
        address=(TextView)itemView.findViewById(R.id.frontaddress);
        v = itemView;
       
        setOnClickListeners();
    }


    private void setOnClickListeners() {
    `v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            v.setTag(0);
            listenr.onClick(v, getAdapterPosition());
        }
    });
    }

}

@NonNull
@Override
public FrontlistAdapter.DataObjectHolder onCreateViewHolder(@NonNull ViewGroup parent, 
int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.cell_orderdetail_list, parent, false);
    FrontlistAdapter.DataObjectHolder dataObjectHolder = new 
FrontlistAdapter.DataObjectHolder(view,listenr);

    return dataObjectHolder;
}

@Override
public void onBindViewHolder(@NonNull FrontlistAdapter.DataObjectHolder holder, int 
position) {

}

@Override
public int getItemCount() {
    return options.size;
}
公共类FrontlistAdapter扩展
RecyclerView.适配器{
单击列表器列表器;
语境;
公共FrontlistAdapter(上下文上下文,ClickListner listenr){
this.context=上下文;
this.listenr=listenr;
}
公共静态类DataObjectHolder扩展了RecyclerView.ViewHolder{
语境;
公共数据对象持有者(查看项目视图,单击列表器列表){
超级(项目视图);
this.listenr=listenr;
Frontcover=(ImageView)itemView.findViewById(R.id.Frontcover);
name=(TextView)itemView.findViewById(R.id.frontname);
地址=(TextView)itemView.findViewById(R.id.frontaddress);
v=项目视图;
setOnClickListeners();
}
私有void setOnClickListeners(){
`v、 setOnClickListener(新视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
v、 setTag(0);
listenr.onClick(v,getAdapterPosition());
}
});
}
}
@非空
@凌驾
public FrontlistAdapter.DataObjectHolder onCreateViewHolder(@NonNull ViewGroup parent,
int视图类型){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.cell\u orderdetail\u列表,父项,false);
FrontlistAdapter.DataObjectHolder DataObjectHolder=新建
DataObjectHolder(视图,列表编号);
返回数据对象持有者;
}
@凌驾
public void onBindViewHolder(@NonNull FrontlistAdapter.DataObjectHolder,int
(职位){
}
@凌驾
public int getItemCount(){
返回选项。大小;
}

}

这是在滚动时发生的,还是从一开始就不匹配?在两种情况下都会发生显示在Viewholder中使用getbindingapdapterposition()?我使用了switch case,是否应该使用此方法而不是positions?现在我明白了你的观点,但为什么要使用公共界面ClickListenr{void onClick(视图,int-position)}适配器最后一行的代码?它显示为从未使用过,这不是一个错误感谢这个错误,但现在我遇到了另一个错误,无法为child()中的参数“pathString”传递null,但起初我没有得到这个错误,但现在它显示为这样。您到底从哪里得到这个错误
      public class FrontlistAdapter extends 
      RecyclerView.Adapter<FrontlistAdapter .DataObjectHolder>{

ClickListner listenr;
Context context;

public FrontlistAdapter (Context context,ClickListner listenr) {
    this.context = context;
    this.listenr = listenr;
}

public static class DataObjectHolder extends RecyclerView.ViewHolder {


    Context context;

    public DataObjectHolder(View itemView,ClickListner listenr) {
        super(itemView);

        this.listenr = listenr;
         Frontcover = (ImageView)itemView.findViewById(R.id.frontcover);
        name = (TextView)itemView.findViewById(R.id.frontname);
        address=(TextView)itemView.findViewById(R.id.frontaddress);
        v = itemView;
       
        setOnClickListeners();
    }


    private void setOnClickListeners() {
    `v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            v.setTag(0);
            listenr.onClick(v, getAdapterPosition());
        }
    });
    }

}

@NonNull
@Override
public FrontlistAdapter.DataObjectHolder onCreateViewHolder(@NonNull ViewGroup parent, 
int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.cell_orderdetail_list, parent, false);
    FrontlistAdapter.DataObjectHolder dataObjectHolder = new 
FrontlistAdapter.DataObjectHolder(view,listenr);

    return dataObjectHolder;
}

@Override
public void onBindViewHolder(@NonNull FrontlistAdapter.DataObjectHolder holder, int 
position) {

}

@Override
public int getItemCount() {
    return options.size;
}