You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView滚动时旧数据持续被新插入数据替换问题求助

RecyclerView滚动时旧数据被最后插入的数据替换问题排查

我将初始值存入mWeatherList后,上下滚动RecyclerView时发现旧数据不断被最后插入的数据替换,相关代码如下:

public class HomePageFragment extends Fragment {

    ///// interface for passing data between fragment and activty
    private HomePageFragment.OnDataPass mVarForPassData;
    public interface OnDataPass {
        void onDataPass();
    }
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        mVarForPassData = (HomePageFragment.OnDataPass) context;
    }

    public void passData() {
        mVarForPassData.onDataPass();
    }
    //data pass to activity

    Button mBtnLogout,mBtnAddCity;
    TextInputEditText mTietCity,mTietCountry;

    ///recycle
    protected RecyclerView mRecyclerView;
    ///working vars
    private List<WeatherCity> mWeatherList= new ArrayList<WeatherCity>(); //da far diventare activity
    public HomePageFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View HomePageView = inflater.inflate(R.layout.homepage_layout_fragment, container, false);

        mBtnLogout=HomePageView.findViewById(R.id.btn_logout);

        mTietCity=HomePageView.findViewById(R.id.tiet_city);
        mTietCountry=HomePageView.findViewById(R.id.tiet_country);

        mRecyclerView = HomePageView.findViewById(R.id.rv_homepage);
        mBtnAddCity=HomePageView.findViewById(R.id.btn_addcity);

        mBtnLogout.setOnClickListener(view -> passData());

        WeatherAdapter adapter = new WeatherAdapter(mWeatherList);
        mRecyclerView.setAdapter(adapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(),
                DividerItemDecoration.VERTICAL);
        mRecyclerView.addItemDecoration(dividerItemDecoration);

        mBtnAddCity.setOnClickListener(view ->{
            AddDataFromAPI(mTietCity.getText().toString(),mTietCountry.getText().toString());
            adapter.SetLocalWeatherCities(mWeatherList,mWeatherList.size()-1);
        });
        return HomePageView;
    }
    private void AddDataFromAPI(String sentCity, String sentCountry){
        ExecutorService executorService = APIcurrentData.DataFetcher(sentCity,sentCountry);
        executorService.shutdown();
        try {
            while(!executorService.awaitTermination(100,
                    TimeUnit.MILLISECONDS)){}
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        mWeatherList.add(APIcurrentData.GetWeather());
    }

    //recycler view
    public class WeatherAdapter extends RecyclerView.Adapter<WeatherAdapter.WeatherHolder> {
        private List<WeatherCity> LocalWeatherCities;

        public WeatherAdapter(List<WeatherCity> dataSet) {
            LocalWeatherCities = dataSet;
        }
        public void SetLocalWeatherCities(List<WeatherCity> dataset,int pos){
            LocalWeatherCities=dataset;
            notifyItemInserted(pos);
        }

        @NonNull
        @Override
        public WeatherHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            View view = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.single_item_recycle_homepage, viewGroup, false);
            return new WeatherHolder(view);
        }

        @Override
        public void onBindViewHolder(WeatherHolder viewHolder, final int position) {
            viewHolder.onBind(LocalWeatherCities.get(position));
        }

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

        @Override
        public int getItemViewType(int position) {
            return position;
        }

        public class WeatherHolder extends RecyclerView.ViewHolder {
            private final ImageView
                    mIV_CurrentWeather=itemView.findViewById(R.id.ic_currentweathericon),
                    mIVRainLogo=itemView.findViewById(R.id.iv_rainlogo);
            private final TextView
                    mTV_SelectedCity=itemView.findViewById(R.id.tv_selectedcity),
                    mTV_SelCityDescr=itemView.findViewById(R.id.tv_description),
                    mTV_SelCityDegrees=itemView.findViewById(R.id.tv_degrees),
                    mTVMinMaxCurrent=itemView.findViewById(R.id.tv_currentminmax),
                    mTXCurrentCloud=itemView.findViewById(R.id.tx_currentcloud),
                    mTXCurrentWind=itemView.findViewById(R.id.tx_currentwind),
                    mTxCurrentHumidity=itemView.findViewById(R.id.tx_currenthumdity),
                    mTxtLastUpdated=itemView.findViewById(R.id.txt_lastupdated),
                    mTxtRainMM=itemView.findViewById(R.id.txt_rainmm);
            private final ImageButton
                    mImgBtnUpdate=itemView.findViewById(R.id.imgbtn_update),
                    mImgBtnEdit=itemView.findViewById(R.id.imgbtn_editcity),
                    mImgBtnDelete=itemView.findViewById(R.id.imgbtn_delete),
                    mImgBtnShowonMap=itemView.findViewById(R.id.imgbtn_showonmap);
            public WeatherHolder(View view) {
                super(view);
                // Define click listener for the ViewHolder's View
              mImgBtnDelete.setOnClickListener(v -> {
                  LocalWeatherCities.remove(getAdapterPosition());
                  notifyItemRemoved(getAdapterPosition());
                  notifyItemRangeChanged(getAdapterPosition(), LocalWeatherCities.size());
              });
              mImgBtnUpdate.setOnClickListener(v -> {

              });
              mImgBtnEdit.setOnClickListener(v -> {

              });
              mImgBtnShowonMap.setOnClickListener(v -> {

              });
            }
            public void onBind(WeatherCity weatherCity){
                mIV_CurrentWeather.setImageBitmap(weatherCity.getWeatherIcon());
                if(!weatherCity.getRain().equals("-1")) {
                    mIVRainLogo.setVisibility(View.VISIBLE);
                    mTxtRainMM.setVisibility(View.VISIBLE);
                    mTxtRainMM.setText(weatherCity.getRain());
                }else{
                    mIVRainLogo.setVisibility(View.INVISIBLE);
                    mTxtRainMM.setVisibility(View.INVISIBLE);
                    mTxtRainMM.setText("");
                }
                mTV_SelectedCity.setText(weatherCity.getCity());
                mTV_SelCityDescr.setText(weatherCity.getDescription());
                mTV_SelCityDegrees.setText(weatherCity.getActualTemp());
                mTVMinMaxCurrent.setText(getString(R.string.minmaxdegree_single_recycle,weatherCity.getMinTemp(),
                        weatherCity.getMaxTemp()));
                mTXCurrentCloud.setText(getString(R.string.current_clouds,weatherCity.getClouds()));
                mTxCurrentHumidity.setText(getString(R.string.currenthumdity,weatherCity.getHumidity()));
                mTxtLastUpdated.setText(weatherCity.getRefreshDate());
                mTXCurrentWind.setText(getString(R.string.currentwind,weatherCity.getWindSpeed(),weatherCity.getWindDegree(),
                        weatherCity.getWindGuts()));

            }
        }
    }
}/////homepage fragment class

我尝试了以下方案,但问题仍未解决:

  • 在WeatherHolder中保存单个WeatherCity实例
  • 每次重新设置Adapter
  • 设置RecyclerView不可复用

恳请帮忙排查问题。

内容的提问来源于stack exchange,提问作者profile testguest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:17:03