2014-06-19 2 views
0

Bref, je lance un appel API qui récupère une liste de noms.Appel de l'API et ajout de boutons par programme

Pour chaque nom récupéré, j'aimerais ajouter un RelativeLayout (avec quelques enfants) à un LinearLayout parent. La disposition relative ressemble à ceci:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/border_bottom" 
    android:clickable="true"> 

    <ImageView 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_weight="11.79" 
     android:background="#58585a" 
     android:id="@+id/imageView" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Large Text" 
     android:id="@+id/textView2" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="26dp" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:text="Small Text" 
     android:id="@+id/textView3" 
     android:layout_below="@+id/textView2" 
     android:layout_alignStart="@+id/textView2" /> 

</RelativeLayout> 

Je voudrais changer les champs « Petit texte » et « Grand texte » à certaines données que j'ai reçu de l'interrogation du serveur.

Quelle est la meilleure façon d'y parvenir? Puis-je stocker la mise en page ci-dessus dans un fichier XML séparé, et rapidement modifier les valeurs de texte, et il suffit de le déposer dans la disposition linéaire existante?

+3

Cela ressemble à un cas d'école pour un 'ListView'. Avez-vous envisagé d'en utiliser un à la place? – matiash

+0

Je l'ai fait, mais il ne convient pas tout à fait à mon cas d'utilisation pour quelques raisons. Dans ce cas, j'ai un ScrollView qui contient un LinearLayout, dans lequel je voudrais insérer le code ci-dessus pour chaque élément tiré de ma base de données. – opticon

+0

Cela ressemble toujours à un cas d'école pour un 'ListView' ... :) Eh bien, techniquement l'approche que vous décrivez fonctionnerait, mais elle ressemble tellement à ce que ListView fait déjà (et probablement plus efficacement, par exemple ne pas créer tout vues des enfants, les réutiliser, & c). – matiash

Répondre

1

COTATION 1:

XML pour la mise en page de chaque élément de la liste -

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout 
    xmlns:android="http://schemas.android.com/ 
    apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <ImageView 
    android:id="@+id/listImage" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:layout_margin="10dp" 
    android:background="#ffcccccc" /> 

    <TextView 
    android:id="@+id/listTitle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignTop="@+id/listImage" 
    android:layout_toRightOf="@+id/listImage" 
    android:text="A List item title" 
    android:textSize="16sp" 
    android:textStyle="bold" /> 

    <TextView 
    android:id="@+id/listDescription" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/listTitle" 
    android:layout_marginTop="5dp" 
    android:maxLines="4" 
    android:layout_toRightOf="@+id/listImage" 
    android:text="The List item description" 
    android:textSize="14sp" />  
</RelativeLayout> 

Listing 2:

XML pour la mise en page contenant le Listview -

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:orientation="vertical" > 

     <ListView 
      android:id="@android:id/list" 
      android:fadingEdge="vertical" 
      android:fadingEdgeLength="10dp" 
      android:longClickable="true" 
      android:listSelector="@drawable/list_selector_background" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 
     </ListView> 
<!-- -->               
     <TextView 
      android:id="@android:id/empty" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="Loading feed data..." /> 
<!-- -->               
</LinearLayout> 
#1 Listview with id of "list" 
#2 TextView with id of "empty" 

Listing 3:

ListActivity pour le ListView dynamique -

public class DynamicListViewActivity extends ListActivity { 

     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.list);        

      ImageListAdapter adapter = new ImageListAdapter(this); 
      setListAdapter(adapter);         

      LoadFeedData loadFeedData = new LoadFeedData(adapter); 
      loadFeedData.execute();          
     } 
} 

Listing 4:

classe LoadFeedData utilisé pour le chargement des données de flux -

public class LoadFeedData extends 
      AsyncTask<void, void,="" arraylist<entry="">> {  

     private final String mUrl =        
     "URL_QUERING_TO_SERVER"; 

     private final ImageListAdapter mAdapter; 

     public LoadFeedData(ImageListAdapter adapter) {   
      mAdapter = adapter; 
     } 

     private InputStream retrieveStream(String url) { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = null; 
      httpGet = new HttpGet(url); 

      HttpResponse httpResponse = null; 
      try { 
      httpResponse = client.execute(httpGet); 
      HttpEntity getResponseEntity = httpResponse.getEntity(); 
      return getResponseEntity.getContent(); 
      } catch (IOException e) { 
      httpGet.abort(); 
      } 
      return null; 
     } 

     @Override 
     protected ArrayList<Entry> doInBackground(Void... params) { 
      InputStream source = retrieveStream(mUrl);     
      Reader reader = null; 
      try { 
      reader = new InputStreamReader(source); 
      } catch (Exception e) { 
      return null; 
      } 
      Gson gson = new Gson(); 
      SearchResult result = gson.fromJson(reader,SearchResult.class);  
      return result.getFeed().getEntry(); 
     } 

     protected void onPostExecute(ArrayList<Entry> entries) { 
      mAdapter.upDateEntries(entries);      
     } 
} 

Listing 5:

ImageListAdapter utilisé pour remplir ListView avec des données et des images -

public class ImageListAdapter extends BaseAdapter { 

     private Context mContext; 

     private LayoutInflater mLayoutInflater;        

     private ArrayList<Entry> mEntries = new ArrayList<Entry>();   

     private final ImageDownloader mImageDownloader;      

     public ImageListAdapter(Context context) {       
      mContext = context; 
      mLayoutInflater = (LayoutInflater) mContext 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      mImageDownloader = new ImageDownloader(context); 
     } 

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

     @Override 
     public Object getItem(int position) { 
      return mEntries.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, 
      ViewGroup parent) {           
      RelativeLayout itemView; 
      if (convertView == null) {           
      itemView = (RelativeLayout) mLayoutInflater.inflate(
         R.layout.list_item, parent, false); 

      } else { 
      itemView = (RelativeLayout) convertView; 
      } 

      ImageView imageView = (ImageView) 
      itemView.findViewById(R.id.listImage);       
      TextView titleText = (TextView) 
      itemView.findViewById(R.id.listTitle);       
      TextView descriptionText = (TextView) 
      itemView.findViewById(R.id.listDescription);     

      String imageUrl = mEntries.get(position).getContent().getSrc(); 
      mImageDownloader.download(imageUrl, imageView);     

      String title = mEntries.get(position).getTitle().get$t(); 
      titleText.setText(title); 
      String description = 
      mEntries.get(position).getSummary().get$t(); 
      if (description.trim().length() == 0) { 
      description = "Sorry, no description for this image."; 
      } 
      descriptionText.setText(description); 

      return itemView; 
     } 

     public void upDateEntries(ArrayList<Entry> entries) { 
      mEntries = entries; 
      notifyDataSetChanged(); 
     } 
} 

Grande ! De cette façon, vous allez charger des données dynamiques du serveur et les afficher dans une liste. Évidemment, vous pouvez en changer une partie ou plus pour l'ajouter à votre application. À la votre!

+0

J'ai dû modifier cela un peu mais cela m'a mis sur le bon chemin! Merci! – opticon

0

Par cette approche, si vous recevez une liste contenant plus de 10 éléments, votre application aura des performances très très faibles. 99% de probabilité que tous vos objectifs puissent être atteints en utilisant ListView avec votre adaptateur personnalisé. Dans ce cas, Android ne créera des vues que si elle est affichée à l'écran. Dans votre cas, les vues existent même si elles ne sont pas nécessaires. Bien que, si vous souhaitez toujours utiliser votre approche, vous pouvez trouver TextView par cet ID et modifié leur texte.

Code approximatif

... 
LayoutInflater inflater = LayoutInflater.from(getContext()); 
customView = inflater.inflate(%Your_layout_id%, null); // Put id of your xml layout file 

largeTextView = (TextView)customView.findViewById(R.id.textView2); 
largeTextView.setText(%your_large_text%); 
TextView smallTextView = (TextView)customView.findViewById(R.id.textView3); 
smallTextView.setText(%your_small_text%); 
...