Android 回收器视图列表变得混乱
我正在使用recycler视图填充数组列表Android 回收器视图列表变得混乱,android,android-recyclerview,Android,Android Recyclerview,我正在使用recycler视图填充数组列表 public class Recycleradapter extends RecyclerView.Adapter<Recycleradapter.ViewHolder> { private ArrayList<Merchant> mDataset = new ArrayList<>(); private Context mContext; private Handler mHandler; private int
public class Recycleradapter extends RecyclerView.Adapter<Recycleradapter.ViewHolder> {
private ArrayList<Merchant> mDataset = new ArrayList<>();
private Context mContext;
private Handler mHandler;
private int lastPosition = -1;
private Handler callHandler;
public Recycleradapter(ArrayList<Merchant> list,Context context,Handler handler,Handler callHandler)
{
mContext = context;
mHandler = handler;
mDataset = list;
this.callHandler = callHandler;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.merchantcard, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
Merchant merchant = new Merchant();
merchant= mDataset.get(position);
holder.MerchantName.setText(merchant.MerchantName);
holder.Address.setText(merchant.Address1);
if(merchant.Distance!= null)
{
if(merchant.Distance>1000)
{
merchant.Distance= merchant.Distance/1000;
holder.Distance.setText(new DecimalFormat("##.##").format(merchant.Distance)+" km");
}else
{
holder.Distance.setText(new DecimalFormat("##.##").format(merchant.Distance)+" m");
}
}
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message message = mHandler.obtainMessage();
Bundle b = new Bundle();
b.putInt("pos", position);
message.setData(b);
message.sendToTarget();
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public static TextView MerchantName,Address,Distance;
public static CardView cardView;
public static ImageView call;
public ViewHolder(View itemView) {
super(itemView);
MerchantName = (TextView)itemView.findViewById(R.id.MerchantName);
Address = (TextView)itemView.findViewById(R.id.MerchantAddressline1);
cardView = (CardView)itemView.findViewById(R.id.MerchantCard);
call =(ImageView)itemView.findViewById(R.id.merchant_call);
Distance= (TextView)itemView.findViewById(R.id.distance_merchant_card);
}
}
private void setAnimation(View viewToAnimate, int position)
{
// If the bound view wasn't previously displayed on screen, it's animated
if (position > lastPosition)
{
Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left);
viewToAnimate.startAnimation(animation);
lastPosition = position;
}
}
}
公共类Recycleradapter扩展了RecyclerView.Adapter{
private ArrayList mDataset=new ArrayList();
私有上下文;
私人经理人;
private int lastPosition=-1;
私有处理器callHandler;
公共Recycleradapter(ArrayList列表、上下文上下文、处理程序、处理程序调用处理程序)
{
mContext=上下文;
mHandler=handler;
mDataset=列表;
this.callHandler=callHandler;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext())
.充气(R.layout.merchantcard,父项,错误);
视窗夹持器视窗夹持器=新视窗夹持器(v);
返回视图持有者;
}
@凌驾
公共无效onBindViewHolder(ViewHolder,最终int位置){
商户=新商户();
商户=mDataset.get(位置);
holder.MerchantName.setText(merchant.MerchantName);
持有人地址setText(商户地址1);
if(商户距离!=null)
{
如果(商户距离>1000)
{
商户距离=商户距离/1000;
holder.Distance.setText(新的十进制格式(“##########”)格式(商户距离)+“公里”);
}否则
{
holder.Distance.setText(新的十进制格式(“###.#####”)格式(merchant.Distance)+“m”);
}
}
holder.cardView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Message Message=mHandler.obtainMessage();
Bundle b=新Bundle();
b、 putInt(“pos”,位置);
消息。设置数据(b);
message.sendToTarget();
}
});
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共静态文本查看商品名称、地址、距离;
公共静态CardView CardView;
公共静态图像视图调用;
公共视图持有者(视图项视图){
超级(项目视图);
MerchantName=(TextView)itemView.findViewById(R.id.MerchantName);
地址=(TextView)itemView.findViewById(R.id.MerchantAddressline1);
cardView=(cardView)itemView.findViewById(R.id.MerchantCard);
call=(ImageView)itemviewbyd(R.id.merchant\u call);
距离=(TextView)itemView.findViewById(R.id.Distance\u商户卡);
}
}
私有void setAnimation(视图视图到动画,int位置)
{
//如果绑定视图以前未显示在屏幕上,则会设置动画
如果(位置>最后位置)
{
Animation Animation=AnimationUtils.loadAnimation(mContext,android.R.anim.slide\u在左侧);
viewToAnimate.startAnimation(动画);
最后位置=位置;
}
}
}
当我滚动到列表的底部时,当我滚动回到顶部时,我的顺序会发生变化,有时甚至同一个项目会多次显示
如何解决这个问题
谢谢删除
静态
关键字出现在视图持有者
类中的所有位置。您需要每个ViewHolder
来管理RecyclerView
中单个项目的视图。目前,使用static
,您有多个ViewHolder
实例都使用相同的视图。删除static
关键字,它出现在ViewHolder
类中的任何地方。您需要每个ViewHolder
来管理RecyclerView
中单个项目的视图。目前,使用static
,您有多个ViewHolder
实例都使用相同的视图。删除static
关键字,它出现在ViewHolder
类中的任何地方。您需要每个ViewHolder
来管理RecyclerView
中单个项目的视图。目前,使用static
,您有多个ViewHolder
实例都使用相同的视图。删除static
关键字,它出现在ViewHolder
类中的任何地方。您需要每个ViewHolder
来管理RecyclerView
中单个项目的视图。目前,使用static
,您有几个ViewHolder
实例都使用相同的视图。而不是使用
merchant= mDataset.get(position);
你应该使用
merchant= mDataset.get(holder.getAdapterPosition());
并根据绑定时的代码从位置中删除最后一个关键字。它修复了位置,回收器视图与视图保持器一起工作。而不是使用
merchant= mDataset.get(position);
你应该使用
merchant= mDataset.get(holder.getAdapterPosition());
并根据绑定时的代码从位置中删除最后一个关键字。它修复了位置,回收器视图与视图保持器一起工作。而不是使用
merchant= mDataset.get(position);
你应该使用
merchant= mDataset.get(holder.getAdapterPosition());
并根据绑定时的代码从位置中删除最后一个关键字。它修复了位置,回收器视图与视图保持器一起工作。而不是使用
merchant= mDataset.get(position);
你应该使用
merchant= mDataset.get(holder.getAdapterPosition());
并根据绑定时的代码从位置中删除最后一个关键字。它修复了位置,回收器视图与视图保持器一起工作。非常感谢我了解问题现在工作正常@commonwarethanks非常了解问题现在工作正常@commonwarethanks非常了解问题现在工作正常@CommonwareThanks很多我理解这个问题现在在commonware中运行良好