2016-06-03 6 views
1

Ich habe zwei Aktivitäten: 1. enthält die Listview (Activity1), 2. Details jeder Zeile in der Listview (Activity2).adapter.notifyDataSetChange() Aktualisierung der Listenansicht nach der Rückkehr von einer anderen Aktivität

Wenn der Benutzer auf eine beliebige Zeile der Listenansicht in Aktivität1 klickt, werden die entsprechenden Details in Aktivität2 angezeigt, d. H. Aktivität2 wird gestartet. Wenn der Benutzer einige Details in Activity2 bearbeitet, werden alle Änderungen auf dem Server gespeichert und wenn ich zu Activity1 zurückkehre, hole ich die neue (aktualisierte) Liste vom Server und möchte die UI (Listview) von Activity1 aktualisieren. Aber das passiert nicht. Ich tue das folgende Listenansicht zu aktualisieren:

@Override 
protected void onStart() { 
    super.onStart(); 
    Toast.makeText(this, "onStart", Toast.LENGTH_LONG).show(); 
    PetService petService = FactoryMaker.getFactory(AppConstants.PET_SERVICE).getPetServiceImpl(AppConstants.PARSE_IMPL, this); 
    //pets = petService.getPetList(); 
    //adapter = new PetListArrayAdapter(getApplicationContext(),R.layout.pet_list_item, pets); 
    //petListView.setAdapter(adapter); 

    pets = petService.getPetList(); 
    adapter.clear(); 
    adapter.addAll(pets); 
    adapter.notifyDataSetChanged(); 

    if(pets.size()>0) { 
     retrieve.setVisibility(View.INVISIBLE); 
    }else{ 
     retrieve.setVisibility(View.VISIBLE); 
    } 
} 

Allerdings, wenn ich den Adapter wieder eingestellt (wie die drei Zeilen, die ich kommentiert out), wird die Listenansicht nach Bedarf aktualisiert, aber mit notifyDataSetChanged(), seine nicht funktioniert. Ich habe alle Fragen für dieses Problem verfolgt, aber nichts scheint zu funktionieren. Mein Adapter erstreckt sich von ArrayAdapter. Bitte helfen Sie!

Mein Adapter Implementierung:

public class PetListArrayAdapter extends ArrayAdapter<Pet> { 

    private final String TAG="PetListArrayAdapter"; 

    private List<Pet> pets = null; 
    private Context applicationContext =null; 

    public PetListArrayAdapter(Context context, int resource, List<Pet> petList) { 
      super(context, resource, petList); 
      pets = petList; 
      applicationContext = context; 
    } 

    @Override 
    public int getCount(){ 
      int size = 0; 
      if(pets!=null) { 
      size = pets.size(); 
      } 
      return size+1; 
    } 

    @Override 
    public int getItemViewType(int position) { 
      return (position == 0) ? 0 : 1; 
    } 

    @Override 
    public int getViewTypeCount() { 
      return 2; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Log.d(TAG, "getView for position" + position); 
     int type = getItemViewType(position); 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if(convertView==null) { 
       if(type==1) { 
        convertView = inflater.inflate(R.layout.pet_list_item, null); 
        TextView t = (TextView)convertView.findViewById(R.id.petName); 
        final Pet pet = pets.get(position-1); 
        Log.d(TAG, "pet:" + pet); 
        t.setText(pet.getName()); 

        ImageView petImage =(ImageView)convertView.findViewById(R.id.petImage); 

        String imageUrl = pet.getThumbnailUrl(); 
        //if(petImage.getDrawable()==null) { 
        if (imageUrl != null) { 
         Log.d(TAG, "Loading Image for position" + position); 
         new ImageDownloader(petImage).execute(imageUrl); 
        } 
      /*}else{ 
      Log.d(TAG, "Image present for position" + position); 
      }*/ 
      }else if (type==0){ 
       convertView = inflater.inflate(R.layout.add_pet, null); 
      } 
     } 

     return convertView; 
    } 
} 
+0

Zuerst ist die Anfrage auf einem Hintergrundthread oder ui thread ? Zweitens, was ist die Adapter-Implementierung, können Sie es zeigen? –

+0

Die Anfrage befindet sich im UI-Thread. –

+0

Wie eine Anfrage an einen Server auf UI-Thread sein kann, bekomme ich nicht. –

Antwort

0

Versuchen

pets.clear(); 
pets.addAll(petService.getPetList()); 
adapter.notifyDataSetChanged(); 

Ich denke, die Adapterliste verliert seinen Link auf die aktuelle Liste.

+0

Nein, es funktioniert nicht. Die Liste wird immer noch nicht aktualisiert. –

0

Fügen Sie Ihren Abrufcode in auf Lebenslauf

@Override 
    protected void onResume() { 
     super.onResume(); 

     pets = petService.getPetList(); 
     adapter.clear(); 
     adapter.addAll(pets); 
     adapter.notifyDataSetChanged(); 

     if(pets.size()>0) { 
      retrieve.setVisibility(View.INVISIBLE); 
     }else{ 
      retrieve.setVisibility(View.VISIBLE); 
     } 
    } 
0
  1. Zunächst, Beginn Activity2 die startActivityForResult mit (Absicht, requesCode) anstelle des startActivity (Vorsatz) -Methode.
  2. Überschreiben/implementieren Sie das onActivityResult (int requestCode, int resultCode, Intent-Daten) von Activity1 und führen Sie diese Codes aus. Dadurch wird sichergestellt, dass onBackPressed Ihre Liste aktualisiert wird

    pets.clear(); pets.addAll (petService.getPetList()); adapter.notifyDataSetChanged();

so werden Ihre Codes aussehen

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    //...some codes 

    pets.clear(); 
    pets.addAll(petService.getPetList()); 
    adapter.notifyDataSetChanged(); 

} 
0


ich mit diesem Adapter getestet und es funktioniert auf meiner Seite. Jedoch, Ich hatte keine Bilder beigefügt, aber es sollte gut funktionieren.

public class CustomArrayAdapter extends ArrayAdapter<Pet> { 
    private final String TAG = "PetListArrayAdapter"; 

    private List<Pet> pets = null; 

    public CustomArrayAdapter(Context context, List<Pet> petList) { 
     super(context, 0, petList); 
     pets = petList; 
    } 

    @Override 
    public int getCount() { 
     int size = 0; 
     if (pets != null) { 
      size = pets.size() + 1; 
     } 
     return size; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return (position == 0) ? 0 : 1; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Log.d(TAG, "getView for position" + position); 
     ViewHolder holder; 
     int type = getItemViewType(position); 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      if (type == 1) { 
       convertView = inflater.inflate(R.layout.list_item_layout, null); 
       holder.tvName = (TextView) convertView.findViewById(R.id.tv_name); 
       holder.tvDescription = (TextView) convertView.findViewById(R.id.tv_descriotion); 
       final Pet pet = pets.get(position - 1); 
       Log.d(TAG, "pet:" + pet); 

       convertView.setTag(holder); 
      } else if (type == 0) { 
        convertView = inflater.inflate(R.layout.list_add_layout, null); 
        holder.tvName = (TextView) convertView.findViewById(R.id.tv_add); 
      } 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     if (holder != null) { 
      if (type == 1) { 
       holder.tvName.setText(pets.get(position - 1).getName()); 
       if (holder.tvDescription != null) { 
        holder.tvDescription.setText(pets.get(position - 1).getDescription()); 
       } 
      } else if (type == 0) { 
       holder.tvName.setText("Add new pet"); 
      } 
     } 

     return convertView; 
    } 
    static class ViewHolder { 
     TextView tvName; 
     TextView tvDescription; 
    } 
} 

Ich muß hinzufügen, dass Sie einen richtigen Halter haben müssen, um das Add Haustier Layout und das Layout für Haustiere zu behandeln. Was ich hier hinzugefügt habe, ist nur ein Ausgangspunkt für Sie. Ich würde Basishalter erstellen, der eine Textansicht oder nichts enthält, und spezielle Halter für bestimmte Typen verwenden, und Sie werden in den richtigen Halter gegossen, wenn es Typ 1 oder 0 ist.