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
相关产品推荐
相关产品推荐

