2012-05-11 7 views
5

Mam listView i na każdej pozycji dodałem progressBar, który musi zniknąć po pobraniu obrazu. Ale nie mogłem znaleźć sposobu, aby to zrobić. starałem się, aby zniknął on na klasie getView, ale znika natychmiast po pobraniu obrazu.listView z progiem na każdym elemencie?

Na przykład podczas dodawania niektórych widoków do scrollView w klasie AsyncTask "DoInBackground mogę pobrać obraz, a następnie OnPostExecute mogę ustawić obraz, a następnie usunąć progressBar. Działa to dobrze. Chcę zrobić coś takiego dla listView. Czy ktoś mógłby mi pomóc?

Nie wiem, czy było jasne czy nie, ale mogę podsumować, że mam list_item.xml zawiera widok obrazu i pasek postępu na nim. Chcę, aby te paski postępu zniknęły po pobraniu i ustawieniu obrazów.

Dzięki za pomoc.

Oto moja klasa adaptera:

class myListAdapter extends ArrayAdapter<Items> { 

    private ArrayList<Items> items; 
    private Context ctx; 

    public myListAdapter(Context context, int textViewResourceId, 
      ArrayList<Items> items) { 
     super(context, textViewResourceId, items); 
     this.ctx = context; 
     this.items = items; 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 

     if (v == null) { 
      LayoutInflater inf = (LayoutInflater) ctx 
        .getSystemService(LAYOUT_INFLATER_SERVICE); 
      v = inf.inflate(R.layout.main_list_item, null); 
     } 

     Items index = listContents.get(position); 

     if (index != null) { 

      ImageView img = (ImageView) v.findViewById(R.id.listImage); 
      TextView title = (TextView) v.findViewById(R.id.listTopText); 
      TextView content = (TextView) v.findViewById(R.id.listDownText); 

      if (title != null) 
       title.setText(index.getTitle()); 

      if (content != null) 
       content.setText(index.getContent()); 

      if (img != null) 
       img.setImageBitmap(index.getImageBitmap()); 
      ((ProgressBar) v.findViewById(R.id.listItemProgressBar)).setVisibility(View.GONE); 

     } 

     return v; 
    } 
} 

Tak, na tej linii poniżej, i sprawiają, że pasek postępu nie ma, ale powinien on zniknąć po pobraniu obrazu i ustawić na pozycji ... Ale lista nie dodaje to nie są paski postępu, to mój problem?

((ProgressBar) v.findViewById(R.id.listItemProgressBar)).setVisibility(View.GONE); 
+1

Czy możesz nam wyświadczyć przysługę i pokazać nam kod, który masz w pobliżu, abyśmy mogli lepiej Ci pomóc? – Moiz

+0

Zaktualizowane pytanie z kodami, które chcesz ... – yahya

Odpowiedz

4

Możesz to zrobić, ale nie jest to najlepsza praktyka. powinieneś sam sprawdzić Thread-Sync. i Cache bitmapy użyj LruCache lub WeakRefrences. Demo pokazuje tylko logikę.

final class MyAdapter extends BaseAdapter { 

    private final HashMap<String, Bitmap> mImageMap; 
    private final HashSet<String> mDownloadingSet; 

    public MyAdapter() { 
     mImageMap = new HashMap<String, Bitmap>(); 
     mDownloadingSet = new HashSet<String>(); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return NUMBER_YOU_WANT; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public void setImage(String url, Bitmap bitmap) { 
     mDownloadingSet.remove(url); 
     if (bitmap != null) { 
      mImageMap.put(url, bitmap); 
      notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = getLayoutInflater().inflate(R.layout.grid_view, 
        parent, false); 
      holder = new ViewHolder(); 

      /*** 
      * find the views. 
      */ 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final String url = "";// Get the image url here. 

     if (mImageMap.containsKey(url)) { 
      holder.image.setImageBitmap(mImageMap.get(url)); 
      holder.progressBar.setVisibility(View.GONE); 
     } else { 
      holder.image.setImageResource(R.drawable.img_downloading); 
      holder.progressBar.setVisibility(View.VISIBLE); 
      if (!mDownloadingSet.contains(url)) { 
       ImageDownloader task = new ImageDownloader(); 
       mDownloadingSet.add(url); 
       task.execute(url); 
      } 

     } 

     return convertView; 
    } 
} 

static class ViewHolder { 
    ImageView image; 
    ProgressBar progressBar; 
} 

final class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 

    String url; 

    @Override 
    protected Bitmap doInBackground(String... params) { 
      url = params[0]; 
     final Bitmap bitmap = fetchUrlAndDecode(params[0]); 
     return bitmap; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     mAdapter.setImage(url, result); 
    } 

    private Bitmap fetchUrlAndDecode(String url) { 
     Bitmap bitmap = null; 

     /** 
     * Fetch your bitmap and decode it. 
     */ 

     return bitmap; 
    } 

} 
+0

Mam logikę, wielkie dzięki :) – yahya

1

To jest Twój XML:

<RelativeLayout 
    android:layout_width="50dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:paddingLeft="5dp" > 

    <ProgressBar 
     android:id="@+id/progress" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="40dp" 
     android:layout_below="@+id/text_progress" 
     android:indeterminate="false" 
     android:layout_centerInParent="true" 
     android:progress="50" 
     android:max="100" /> 

    <TextView 
     android:id="@+id/text_progress" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:textColor="#000" 
     android:textStyle="bold" 
     android:textSize="15dp" 
     android:text="0%"/> 

</RelativeLayout> 

i zastąpić metodę getView #:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    if (vi == null) 
     vi = inflater.inflate(R.layout.oportunidade_item_list, null); 

    ProgressBar title = (ProgressBar) vi.findViewById(R.id.progress); 
    title.setProgress(Integer.parseInt(((Oportunidade) get(position)).getProbabilidade())); 
    return super.getView(position, vi, parent); 
} 

wywołanie Super, to będzie ustawić wartości innych widoków dla ciebie, jeśli zrobił z ArrayList<HashMap<?, ?>>

To wszystko;

+0

Co to jest Oportunidade? –

+0

Obiekt modelu z getami i zestawami – jlccaires