2017-02-21 1 views
1

J'ai un ArrayList pour obtenir des données de IntentService. Après avoir reçu mes données, j'ai mis à jour mon adaptateur et j'ai appelé notifyDataSetChanged(). Mais cela ne change pas les données.notifyDataSetChanged ne met pas à jour ma vue de recycleur

Voici mon code:

public class Nearby_ViewPager_Stations extends Fragment { 

private View mRootView = null; 
private RecyclerView mRecyclerView; 
private RecyclerView.LayoutManager mLayoutManager; 
private StationsReceiver mStationsReciever; 
private MKLoader mProgressBar; 

private RecyclerView.Adapter mAdapter; 
private Context mContext; 
ArrayList<ArrayList<StationArrivalPOJO>> stationArrivalPOJO = new ArrayList<>(); 

private static final String TAG = "NearbyViewPagerStations"; 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    mContext = context; 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    if (mRootView == null) { 
     mRootView = inflater.inflate(R.layout.nearby_viewpager_stations, container, false); 
     mRecyclerView = (RecyclerView) mRootView.findViewById(R.id.recycler_view); 
     mProgressBar = (MKLoader) mRootView.findViewById(R.id.progressBar); 
    } 

    mStationsReciever = new StationsReceiver(new Handler()); 
    mLayoutManager = new LinearLayoutManager(mContext); 
    mRecyclerView.setLayoutManager(mLayoutManager); 
    mAdapter = new Adapter_recyclerView(stationArrivalPOJO); 
    mRecyclerView.setAdapter(mAdapter); 

    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      startIntentService(); 
      handler.postDelayed(this, 20*1000); 
     } 
    }, 1000); 
    return mRootView; 
} 

private void startIntentService() { 
    Intent intent1 = new Intent(mContext, GetAllStationsAndStopsIntentService.class); 
    intent1.putExtra("Receiver", mStationsReciever); 
    intent1.putExtra("latitude", Constants.latitude); 
    intent1.putExtra("longitude", Constants.longitude); 
    mContext.startService(intent1); 
} 

void addAdapter(ArrayList<ArrayList<StationArrivalPOJO>> resultData) { 
    mProgressBar.setVisibility(View.GONE); 

    if (stationArrivalPOJO.size() > 0) 
     stationArrivalPOJO.clear(); 
    stationArrivalPOJO.addAll(resultData); 
    mAdapter.notifyDataSetChanged(); 

    Log.v(TAG, "added all data: "+ stationArrivalPOJO.get(0).get(0).getTimeToStation()); 
} 

public class StationsReceiver extends ResultReceiver { 
    StationsReceiver(Handler handler) { 
     super(handler); 
    } 

    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     super.onReceiveResult(resultCode, resultData); 

     addAdapter((ArrayList<ArrayList<StationArrivalPOJO>>)resultData.getSerializable("StationPOJO")); 
    } 
} 

}

Et voici mon code Adaptateur:

class Adapter_recyclerView extends RecyclerView.Adapter { 

private ArrayList<ArrayList<StationArrivalPOJO>> mStationPojoList; 
private LinearLayout mLinearLayout; 

private Context mContext; 

private static final String TAG = "AdapterRecyclerView"; 

Adapter_recyclerView(ArrayList<ArrayList<StationArrivalPOJO>> data) { 
    mStationPojoList = data; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    ((ViewHolder)holder).stationNameTV.setText(mStationPojoList.get(position).get(0).getStationName()); 

    ArrayList<String> mUniqueStationName = new ArrayList<>(); //Unique platform names of a station got from hash set 'uniqStatNames' 
    HashSet<String> uniqStatNames = new HashSet<>(); //Unique platform names of a station 

    for (int i = 0;i<mStationPojoList.get(position).size(); i++) { 
     uniqStatNames.add(mStationPojoList.get(position).get(i).getPlatformName() 
     + mStationPojoList.get(position).get(i).getTowards()); 
    } 

    for(Iterator<String> it = uniqStatNames.iterator() ; it.hasNext() ;) { 
     mUniqueStationName.add(it.next()); 
    } 

    for (int j=0; j<mUniqueStationName.size(); j++) { 
     ArrayList<StationArrivalPOJO> arrivalPOJOs = new ArrayList<>(); //Platform wise categorized train details 
     for (int i = 0;i<mStationPojoList.get(position).size(); i++) { 
      if (mUniqueStationName.get(j).contains(mStationPojoList.get(position).get(i).getPlatformName()) 
        && mUniqueStationName.get(j).contains(mStationPojoList.get(position).get(i).getTowards())) { 
       arrivalPOJOs.add(mStationPojoList.get(position).get(i)); 
      } 
     } 

     Collections.sort(arrivalPOJOs, new Comparator<StationArrivalPOJO>() { 
      @Override 
      public int compare(StationArrivalPOJO stationArrivalPOJO, StationArrivalPOJO t1) { 
       return stationArrivalPOJO.getTimeToStation() - t1.getTimeToStation(); 
      } 
     }); 

     for (int k=0; k<arrivalPOJOs.size(); k++) { 
     Log.v(TAG, j+":"+mUniqueStationName.size()+"boo"+arrivalPOJOs.toString()); 
     Log.v(TAG, "boom " + arrivalPOJOs.get(k).getPlatformName() + ":" + arrivalPOJOs.get(k).getTowards()); 

     RelativeLayout relativeLayout = new RelativeLayout(mContext); 
     relativeLayout.setPadding(16, 16, 16, 16); 
     LinearLayout linearLayout = new LinearLayout(mContext); 
     linearLayout.setOrientation(LinearLayout.VERTICAL); 

     TextView trainName = new TextView(mContext); 
     trainName.setText(arrivalPOJOs.get(k).getPlatformName()); 

     TextView towards = new TextView(mContext); 
     towards.setText(arrivalPOJOs.get(k).getTowards()); 

     linearLayout.addView(trainName); 
     linearLayout.addView(towards); 

     RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT); 
     layoutParams1.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     linearLayout.setLayoutParams(layoutParams1); 

     TextView time = new TextView(mContext); 
     time.setText(String.valueOf(arrivalPOJOs.get(k).getTimeToStation())); 

     RelativeLayout.LayoutParams layoutParams2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT); 
     layoutParams2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     time.setLayoutParams(layoutParams2); 

     relativeLayout.addView(linearLayout); 
     relativeLayout.addView(time); 

     mLinearLayout.addView(relativeLayout); 
     }} 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View rootView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.adapter_recyclerview,parent,false); 
    mContext = parent.getContext(); 

    mLinearLayout = (LinearLayout) rootView.findViewById(R.id.cardViewLinearLayout); 
    TextView mStationName = (TextView) rootView.findViewById(R.id.stationName); 

    return new ViewHolder(rootView, mStationName); 
} 

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

private static class ViewHolder extends RecyclerView.ViewHolder { 
    TextView stationNameTV; 

    ViewHolder(View view, TextView stationNameTV) { 
     super(view); 
     this.stationNameTV = stationNameTV; 
    } 
} 

}

Lorsque je récupère les données de ArrayList et imprimer dans le journal station je reçois des valeurs mises à jour. Mais ces mises à jour ne sont pas reflétées dans ma liste de recycleurs.

J'ai vu d'autres questions dans Stack Overflow disant que:

  1. nous avons besoin des données de mise à jour du même objet Fragment

  2. notifyDataSetChanged() `doit être appelé à partir de fils ui.

Je ne comprends pas ce qui me manque.

+0

ajouter le code de votre adaptateur –

+0

vous n'êtes pas envoyer de nouvelles données à l'adaptateur! –

+0

@Atef Hares J'ai appelé addAll() sur ArrayList, puis appelé notifyDataSetChanged() sur l'adaptateur. Ces deux lignes ne sont-elles pas suffisantes pour mettre à jour RecyclerView? – Sindhu

Répondre

0

Vous n'avez pas besoin de redéfinir l'adaptateur pour mettre à jour les éléments.

Au lieu de cela que vous essayez de faire, vous devez appeler notifyDataSetChanged() mais pour ce faire que vous devez mettre à jour la première des données de l'ADAPTER, voici une bonne façon de le faire:

1-

ajouter cette méthode à votre adaptateur

public void updateData(final ArrayList<ArrayList<StationArrivalPOJO>> stationArrivalPOJO) { 
     mStationPojoList= new ArrayList<>(); 
     mStationPojoList.addAll(stationArrivalPOJO); 
    } 

2-

dans votre intérieur Nearby_ViewPager_StationsaddAdapter, procédez comme suit:

stationArrivalPOJO.addAll(resultData); 
    mAdapter.updateData(stationArrivalPOJO); // updating adapter's data 
    mAdapter.notifyDataSetChanged(); //notifying the adapter 
+0

J'ai essayé comme tu l'as dit. Mais il ne met pas à jour les données – Sindhu

+0

Impossible, vous êtes sûr que vous avez passé les nouvelles données correctes, je veux dire qu'avant d'appeler 'mAdapter.updateData (stationArrivalPOJO);' êtes-vous sûr que 'stationArrivalPOJO' a de nouvelles données ou non? avez-vous débogué le code? –

+0

Voici les lignes que j'ai ajoutées: stationArrivalPOJO.clear(); stationArrivalPOJO.addAll (resultData); Adapter_recyclerView view = new Adapter_recyclerView(); view.updateData (stationArrivalPOJO); mAdapter.notifyDataSetChanged(); – Sindhu