2017-08-12 2 views
0

Je dois stocker plusieurs variables différentes et les envoyer ensuite à un ListViewAdapter en tant que tableau afin de pouvoir créer des lignes personnalisées. Toutefois, puisque l'objet qui provient du tableau utilise AsyncTask puisque j'utilise JSoup et que j'accède à Internet, j'ai besoin d'un moyen de récupérer ces variables dans l'adaptateur personnalisé avant de renvoyer la vue personnalisée à la classe principale. Code est la suivante:Android: Création d'un adaptateur ListView avec un tableau d'objets AsyncClass

ListView Code Adaptateur:

public class CustomAdapter extends ArrayAdapter<getProductAttributes> implements OnCallCompleteCallBack{ 
String title; 
String price; 
Bitmap image; 

    //ArrayAdapter needs constructor, second parameter gets the layout for the list, third parameter is the array itself. "Context" always means background information. 
    CustomAdapter(Context context, getProductAttributes[]items){ 
     super(context,R.layout.custom_row, items); 
    } 

    public void onCallComplete(int listSize, String title, String price, String imageSRC, String productURL){ 
     this.title=title; 
     this.price = price; 
     //Get Bitmap for image 
     Bitmap mIcon11 = null; 
      try { 
       InputStream in = new java.net.URL(imageSRC).openStream(); 
       mIcon11 = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
     this.image=mIcon11; 
    } 

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     //One custom view is going to be equal to one row 
     View customView = inflater.inflate(R.layout.custom_row,parent,false); 
     ImageView productImage = (ImageView)customView.findViewById(R.id.imageView); 
     TextView itemTitle = (TextView)customView.findViewById(R.id.itemTitle); 
     TextView itemPrice = (TextView)customView.findViewById(R.id.itemPrice); 

     productImage.setImageBitmap(image); 
     itemTitle.setText(title); 
     itemPrice.setText(price); 
     return customView; 

    } 


} 

classe getProductAttributes qui s'étend AsyncTask:

public class getProductAttributes extends AsyncTask<Object, Object, Void> { 
    OnCallCompleteCallBack callback; 
    String url; 
    int index; 
    String productURL; 
    private String price; 
    private String title; 
    private String imageSRC; 
    ImageView productView; 
    int listSize; 
    int result; 

public getProductAttributes(String url, int index, OnCallCompleteCallBack callback) { 
    this.url = url; 
    this.index = index; 
    this.callback = callback; 
} 

protected Void doInBackground(Object... voids) { 
    try{ 
     (code that gets all of the attributes, I'm sure that this code is working fine) 
     }catch(Exception e){} 

    return null; 
    } 

protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     if (callback != null) { 
      callback.onCallComplete(listSize,title,price,imageSRC,productURL); 

     } 
    } 

Je pense que le problème semble être que le temps que je exécutez onCallComplete dans le CustomAdapter, le CustomView a déjà été renvoyé. Si c'est le cas, que puis-je faire pour l'éviter?

Merci pour votre temps et votre aide!

Répondre

0

Vous n'appelez ci-dessous constructeur:

public getProductAttributes(String url, int index, OnCallCompleteCallBack callback) { 
    this.url = url; 
    this.index = index; 
    this.callback = callback; 
} 

Afin de laisser votre objet écouteur vous devez travailler définir l'objet callback. Aussi, ne commencez pas la première lettre de votre classe avec des minuscules.

+0

Comment ça? J'utilise l'objet callback dans la méthode onPostExecute, donc je ne suis pas sûr de ce que je suis censé faire, puisque j'utilise aussi le callback sur une Activity pour définir le listSize et ça marche bien. En outre, merci de souligner le getProductAttributes casse inférieur, je ne l'avais même pas remarqué. – coolyfrost

+0

Votre classe CustomAdapter implémente l'interface: OnCallCompleteCallBack, CustomAdapter met alors en œuvre la méthode de l'interface OnCallCompleteCallBack et agit comme un écouteur. Maintenant, dans votre classe getProductAttributes, vous utilisez l'objet OnCallCompleteCallBack de rappel (callback). Cet objet (callback) doit être initialisé par la classe qui écoute, dans ce cas le CustomAdapter. – HaroldSer

+0

Montrez-moi où vous définissez le constructeur de votre classe "getProductAttributes". Actuellement, le rappel d'objet de: "callback.onCallComplete (listSize, titre, prix, imageSRC, productURL);" a une référence de la classe qui définit le constructeur pour getProductAttributes. Votre classe CustomAdapter ne peut pas écouter "callback.onCallComplete (listSize, title, price, imageSRC, productURL);" – HaroldSer