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