问题描述
我正在创建一个以 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);
}
}
}
解决方法
首先你要做的就是创建这样的界面
public interface ClickListner {
void onClick(View view,int position);
}
然后在您的活动中像这样创建接口的对象并将其与其他数据一起传递给适配器
ClickListner listener = ClickListner();
FrontlistAdapter customAdapter = new
FrontlistAdapter(AcceptedOrdersActivity.this,listener);
riderView.setAdapter(customAdapter);
在 onCreate 和 Intent 外复制此内容
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;
}
}
,positions = position;
这是你的问题。您正在为适配器中的所有内容设置一个全局位置。
在您当前使用 position
的任何地方,您都应该在 ViewHolder
上调用 getBindingAdapterPosition()
。