2016-02-16 27 views
5

Ciao come aggiornare listView quando si preme indietro in un'altra attività. Sto usando il database, dove sto cancellando una riga particolare in uno Activity, se premuto indietro da solo, non si sta aggiornando. Quando passo a un'altra attività o app chiusa, apri e funziona correttamente, dove viene aggiornato listView.Come aggiornare listview quando premuto da un'altra attività Android?

Ecco il codice ..

public class FragmentLiveChats extends Fragment { 
    private AdapterLiveChat adapterChatHistory; 
    private List<LiveChatDetails> customerDetail; 
    private ListView mListView; 
     private List<LiveChatDetails> list; 
@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
list =AAEDatabaseHelper.getLiveChatDetails(Constants.TABLE_LIVE_CHAT); 
    mListView = (ListView) rootView.findViewById(R.id.list_chat_history); 
     parseResponse(); 
} 

private void parseResponse(){ 
for(int i=0;i<list.size();i++){ 
     LiveChatDetails chatDetailsList = new LiveChatDetails(); 
     chatDetailsList.setId(list.get(i).getId()); 
     chatDetailsList.setFromUsername(list.get(i).getFromUsername()); 
     chatDetailsList.setChatTime(list.get(i).getChatTime()); 
     chatDetailsList.setLatMsg(list.get(i).getLatMsg()); 
     customerDetail.add(chatDetailsList); 
    } 
    setValuesInAdapter(); 
} 
@Override 
public void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    adapterChatHistory.updateList(customerDetail); 
    adapterChatHistory.notifyDataSetChanged(); 
} 

private void setValuesInAdapter() { 
    if (adapterChatHistory == null) { 
     adapterChatHistory = new AdapterLiveChat(context); 
    } 
    adapterChatHistory.setExpertData(customerDetail); 
    if (customerDetail != null && !customerDetail.isEmpty()) { 
     mListView.setVisibility(View.VISIBLE); 
     viewNoData.setVisibility(View.GONE); 
     mListView.setAdapter(adapterChatHistory); 
    } else { 
     mListView.setVisibility(View.GONE); 
     viewNoData.setVisibility(View.VISIBLE); 
    } 
    adapterChatHistory.notifyDataSetChanged(); 
    mListView.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      LiveChatDetails chatDetails = (LiveChatDetails) parent.getAdapter() 
               .getItem(position); 
      Log.e("chatDetails", "chat details"+chatDetails.getId()); 
      Intent intent = new Intent(context,ActivityExpertChatView.class); 
      intent.putExtra(Constants.CHAT_USER_NAME, chatDetails.getId()); 
      startActivity(intent); 
     } 
    }); 
} 

In adattatore:

public void setExpertData(List<LiveChatDetails> mTempData) { 
    this.mTempData = mTempData; 
} 

In ExpertChatView attività, sto cancellazione di un record e se vengo a questa schermata, vale a dire, l'attività precedente indietro premere, rimane la stessa lista e non si aggiorna. Ma quando chiudo l'app e apro, funziona perfettamente.

Nell'attività expertChatView, sto cancellando il record del nome utente.

AAEDatabaseHelper.deleteUsername(<username>); 

Ho provato utilizzando notifyDatasetChanged metodo onResume() ma ancora lo stesso problema.

EDIT

Adapter class 

public class AdapterLiveChat extends BaseAdapter { 
private Context context; 
private List<LiveChatDetails> mTempData; 
private LayoutInflater mInflater; 
private LiveChatDetails liveChatDetails; 

private View adView; 
private ViewHolder holder; 

private String userImageUrl; 


public AdapterLiveChat(Context context) { 
    this.context = context; 
    imgLoader = Picasso.with(context); 
    mCalendar = Calendar.getInstance(); 
} 

public void setExpertData(List<LiveChatDetails> mTempData) { 
    this.mTempData = mTempData; 
} 

public void updateList(List<LiveChatDetails> mChatDetails) { 
    this.mTempData = mChatDetails; 
} 

@Override 
public int getCount() { 
    return mTempData.size(); 
} 

@Override 
public LiveChatDetails getItem(int position) { 
    return mTempData.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent)      { 
    mInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    liveChatDetails = getItem(position); 
    adView = convertView; 
    if (adView == null) { 
     holder = new ViewHolder(); 
     adView = mInflater.inflate(R.layout.row_live_chats, null); 
     holder.txtName = (CustomTextView) adView 
       .findViewById(R.id.txt_name); 
    adView.setTag(holder); 
    } else 
     holder = (ViewHolder) adView.getTag(); 
    holder.txtName.setText(liveChatDetails.getFromUsername()); 
    return adView; 
    } 

// vista della classe titolare qui ...

+0

ovviamente notifyDatasetChanged non è una bacchetta magica ... se non si modificano i dati underlaying non aiuterà ... – Selvin

+0

È necessario aggiornare anche l'elenco dati prima di chiamare NotifyDataSetChanged() – Chol

+0

aggiungere i dati aggiornati all'adattatore listview e notificarlo su backpress –

risposta

3

Scrivi qui di seguito il metodo in Adapter

public void updateList(List<Messages> mChatDetails) { 
    this.mChatDetails.clear(); 
    this.mChatDetails.addAll(mChatDetails) 
} 

Nella ripresa recuperare i dati dal database e chiamare updateList (Lista mChatDetails) Metodo quindi chiamare notifyDatasetChanged()

@Override 
public void onResume() { 
    // fetch updated data 
    adapter.updateList(mChatDetails); 
    adapter.notifyDataSetChanged(); 
} 
+0

no..stilliamo sempre. non cambiato. :( – Star

+0

puoi postare il tuo codice su onresume? Funziona sicuramente. Da molto indietro sto usando questo approccio. –

+0

hi..i ha postato il codice incluso l'adattatore. – Star

0

eliminare tale elemento dalla lista customerDetail e quindi chiamare notifydatasetchanged()

+0

per favore mostrate dove sto facendo l'errore nel codice – Star