2013-04-12 3 views
6

screen shotAndroid: immagine Change per un prodotto in listview

Nell'immagine qui sopra, c'è una vista lista che contiene un elenco di voci che l'utente può scaricare. download button Questa è l'immagine che indica all'utente che può scaricare il file. Al termine del download, l'immagine cambierà in download completed button. Il mio problema è quando scarico un file, l'immagine di stato (che indica che il download è completato) viene cambiata per un'altra riga, invece, dovrebbe cambiare per la riga che avevo selezionato. Al momento, se scarico il primo file nell'elenco, l'immagine viene modificata per il 4 ° o 5 ° elemento nell'elenco. Inoltre, quando provo a scaricare qualsiasi altro file dalla lista. apre l'ultimo file scaricato (questa è la funzionalità dell'app che se il file è già stato scaricato, quindi aprilo nel lettore di pdf), cioè se scarico il primo file nell'elenco e poi vado per il secondo elemento, invece di scaricare il secondo file, apre l'ultimo file scaricato. Inoltre, se faccio scorrere la lista, lo stato del download viene modificato anche per gli altri elementi nell'elenco. Qui di seguito, è il mio codice adattatore:

public class DownloadListAdapter extends BaseAdapter { 
Context ctx; 
public ArrayList<DownloadListDao> mDownloadList; 
String readMoreLink; 
public static final String TAG = "DownloadListAdapter"; 
ProgressDialog mProgressDialog; 
private boolean isSDCardPresent; 
File tieDir; 
int downloadState[]; 

public DownloadListAdapter(Context ctx, 
     ArrayList<DownloadListDao> mDownloadList) { 
    this.ctx = ctx; 
    this.mDownloadList = mDownloadList; 
    downloadState = new int [mDownloadList.size()]; 
    for(int i = 0; i < mDownloadList.size(); i++) { 
     downloadState[i] = 0; 
    } 
    tieDir = new File(Environment.getExternalStorageDirectory().toString() 
      + "/tie"); 
}// Constructor 

public int getCount() { 
    return this.mDownloadList.size(); 
}// getCount 

public Object getItem(int position) { 
    return this.mDownloadList.get(position); 
}// getItem 

public long getItemId(int position) { 
    return 0; 
}// getItemId 

static class ViewHolder { 
    TextView txtTitle, txtTheme, txtDate; 
    ImageView imgDownload; 
}// ViewHolder 

ViewHolder holder; 

public View getView(final int position, View convertView, ViewGroup parent) { 
    final String url = mDownloadList.get(position).getUrl(); 
    if (convertView == null) { 
     convertView = LayoutInflater.from(parent.getContext()).inflate(
       R.layout.downlist_adapter, null); 
     holder = new ViewHolder(); 

     holder.txtTitle = (TextView) convertView 
       .findViewById(R.id.txtTitle); 
     holder.txtTheme = (TextView) convertView 
       .findViewById(R.id.txtTheme); 
     holder.txtDate = (TextView) convertView.findViewById(R.id.txtDate); 
     holder.imgDownload = (ImageView) convertView 
       .findViewById(R.id.imgDload); 

     holder.imgDownload.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       File mediaFile = null; 
       if (url != null && !url.equals("null") && !url.equals("")) { 
        String fileName = url.toString().substring(
          url.toString().lastIndexOf("/") + 1, 
          url.toString().length()); 
        mediaFile = new File(tieDir, fileName); 
       } 
       processFile(mediaFile, url, position); 
       int pos = (Integer)v.getTag(); 
       downloadState[pos] = 1; 
      } 
     }); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    if (mDownloadList != null && mDownloadList.size() > 0) { 
     if (mDownloadList.get(position).getTitle() != null 
       && !mDownloadList.get(position).getTitle().equals("null") 
       && !mDownloadList.get(position).getTitle().equals("")) { 
      holder.txtTitle.setText(mDownloadList.get(position).getTitle()); 
     } 

     if (mDownloadList.get(position).getTheme() != null 
       && !mDownloadList.get(position).getTheme().equals("null") 
       && !mDownloadList.get(position).getTheme().equals("")) { 
      holder.txtTheme.setText(mDownloadList.get(position).getTheme()); 
     } 

     if (mDownloadList.get(position).getDate() != null 
       && !mDownloadList.get(position).getDate().equals("null") 
       && !mDownloadList.get(position).getDate().equals("")) { 
      holder.txtDate.setText(mDownloadList.get(position).getDate()); 
     } 

     if (downloadState[position] == 1) { 
      holder.imgDownload.setImageDrawable(ctx.getResources() 
        .getDrawable(R.drawable.ic_dloaded)); 
     } else { 
      holder.imgDownload.setImageDrawable(ctx.getResources() 
        .getDrawable(R.drawable.ic_dload)); 
     } 
    } 
    holder.imgDownload.setTag(position); 
    return convertView; 
}// getView 

protected void downloadFile(String url, int position, String fileName) { 

    Log.v(TAG, "Preparing to download"); 
    mProgressDialog = new ProgressDialog(ctx); 
    mProgressDialog.setMessage("Dowloading..."); 
    mProgressDialog.setIndeterminate(false); 
    mProgressDialog.setMax(100); 
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 

    isSDCardPresent = Environment.getExternalStorageState().equals(
      Environment.MEDIA_MOUNTED); 
    if (!isSDCardPresent) { 
     noSDCardAlert(ctx); 
    } else { 
     if ((tieDir.exists()) && (tieDir != null)) { 
      if (NetworkConnection.isOnline(ctx)) { 
       if (tieDir.isDirectory()) { 
        Log.v(TAG, "if tie dir URL:::" + url); 
        new DownloadAudioAsync(ctx, position, fileName).execute(url); 
       } 
      } else { 
       ((DownloadListActivity) ctx) 
         .OpenNetErrDialog("Please check your internet connection..."); 
      } 
     } else { 
      boolean isDirectoryCreated = tieDir.mkdirs(); 
      if (isDirectoryCreated) { 
       Log.v(TAG, "if tie not dir URL:::" + url); 
       if (NetworkConnection.isOnline(ctx)) { 
        new DownloadAudioAsync(ctx, position, fileName).execute(url); 
       } else { 
        ((DownloadListActivity) ctx) 
          .OpenWiFiDialog("Please check your internet connection..."); 
       } 
      } 
     } 
    } 
} 

private void noSDCardAlert(Context ctx) { 
    AlertDialog.Builder ad = new AlertDialog.Builder(ctx); 
    ad.setMessage("No sd card present.."); 
    ad.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
     } 
    }); 

    if (!((DownloadDetail) ctx).isFinishing()) { 
     ad.show(); 
    } 
} 

public void OpenDialog(String messageID) { 

    final Dialog dialog = new Dialog(ctx, 
      android.R.style.Theme_Translucent_NoTitleBar); 
    dialog.setContentView(R.layout.dialog_base); 
    dialog.getWindow().getAttributes().windowAnimations = android.R.style.Animation_Dialog; 
    dialog.setCancelable(false); 

    TextView alertMessage = (TextView) dialog.findViewById(R.id.txtMessage); 
    Button btnOK = (Button) dialog.findViewById(R.id.btnOk); 
    btnOK.setText("Show"); 
    alertMessage.setText(messageID); 
    dialog.show(); 
    btnOK.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      dialog.dismiss(); 
     } 
    }); 
} 

protected void showPdf(File mediaFile) { 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setDataAndType(Uri.fromFile(mediaFile), "application/pdf"); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
    ctx.startActivity(intent); 
} 

public class DownloadAudioAsync extends AsyncTask<String, String, String> { 
    Context ctx; 
    int pos; 
    private ProgressDialog pd; 
    String fileName; 

    public DownloadAudioAsync(Context ctx, int pos, String fileName) { 
     this.ctx = ctx; 
     this.pos = pos; 
     this.fileName = fileName; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     Log.v(TAG, "inside on pre execute"); 
     pd = new ProgressDialog(ctx); 
     pd.setMessage("Downloading...\nPlease wait.."); 
     pd.show(); 
    } 

    @Override 
    protected String doInBackground(String... aurl) { 
     int count; 

     try { 
      Log.v(TAG, 
        "inside do in background with url::" 
          + aurl[0].toString()); 
      aurl[0] = aurl[0].replaceAll(" ", "%20"); 
      URL url = new URL(aurl[0]); 

      URLConnection conexion = url.openConnection(); 
      conexion.connect(); 

      int lenghtOfFile = conexion.getContentLength(); 

      fileName = URLDecoder.decode(fileName, "UTF-8"); 
      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream(tieDir + "/" 
        + fileName); 

      byte data[] = new byte[1024]; 

      long total = 0; 

      while ((count = input.read(data)) != -1) { 
       total += count; 

       publishProgress("" + (int) ((total * 100)/lenghtOfFile)); 
       output.write(data, 0, count); 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
     } catch (Exception e) { 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String unused) { 
     if (!((DownloadListActivity) ctx).isFinishing()) { 
      pd.dismiss(); 
      updateView(pos); 
     } 
    } 

    private void updateView(int pos) { 
     View v = ((DownloadListActivity) ctx).menuListView.getChildAt(pos 
       - ((DownloadListActivity) ctx).menuListView 
         .getFirstVisiblePosition()); 
     ImageView imgDloadBtn = (ImageView) v.findViewById(R.id.imgDload); 
     imgDloadBtn.setImageDrawable(ctx.getResources().getDrawable(
       R.drawable.ic_dloaded)); 
     notifyDataSetChanged(); 
    } 
} 

private void processFile(File mediaFile, String url, int pos) { 
    if (url != null && !url.equals("null") && !url.equals("")) { 
     if (mediaFile != null) { 
      Log.v(TAG, "in processFile FileName " + mediaFile.getName()); 
      Log.v(TAG, "in processFile Position " + pos); 
      if(!mediaFile.exists()) { 
       Log.v(TAG, "in processFile Media file doesn't exists"); 
       downloadFile(url, pos, mediaFile.getName()); 
      } else { 
       Log.v(TAG, "in processFile Media file exists"); 
       try { 
        showPdf(mediaFile); 
       } catch (ActivityNotFoundException anfe) { 
        OpenDialog("PDF Reader is not installed on your device."); 
       } 
      } 
     } 
    } 
} 
}// DownloadAdapter 

avevo letto this post per riciclare la vista (Grazie a Knickedi per approfondita spiegazione). Ma non riesco a capire dove sia il problema reale.

risposta

5

Problema con getview metodo che mantengono ricreando ogni volta che si scorre la visualizzazione, per gestire esatta posizione devi giocare con setTag & getTag, controllare sotto poche risposte stackvoerflow per capire setTag & getTag:

Button in ListView using ArrayAdapter

Getting radio button value from custom list in android

e persino memorizzare lo stato scaricato in uno booleanarray come di seguito:

int boxState[]; 

all'interno costruttore adattatore, impostare lo zero inizialmente:

for (int i = 0; i < getData.size(); i++) { 
    boxState[i] = 0; 

    } 

all'interno del metodo adattatore GetView:

holder.imgDownload.setTag(position); 

Ora è cliccare su download valore impostato pulsante come 1 (all'interno onclick del pulsante):

pos = (Integer) v.getTag(); 
boxState[pos]=1; 

Finalmente quando si scorre la vista, controllare le condizioni nel seguente modo (inserire il codice sotto il metodo getview):

if (boxState[position] == 0) { 
      holder.imgDownload.setImageDrawable(ctx.getResources() 
        .getDrawable(R.drawable.ic_dloaded)); //which aren't downloaded 
     } else { 
      holder.imgDownload.setImageDrawable(ctx.getResources() 
        .getDrawable(R.drawable.ic_dload)); // which are downloaded. 
     } 
+0

Grazie, funziona, ma ora sto affrontando un altro problema. Se faccio clic sul pulsante del primo elemento per scaricare il file, viene scaricato il file corretto. Ma quando clicco di nuovo sullo stesso pulsante, nella prima riga, invece di aprire il file, scarica l'ultimo file. Quello che intendo dire, è in un momento, sei elementi sono visibili nella lista. Quando faccio clic sul pulsante nel primo elemento, viene scaricato il file corretto, ma quando faccio nuovamente clic su di esso, scarica il file associato all'URL del 6 ° elemento nella visualizzazione elenco. Ho aggiornato il mio codice. – Nitish

+0

Basta cambiare la posizione di questa riga 'holder.imgDownload.setTag (posizione);' mantenere prima onclick del pulsante e quindi controllare – RobinHood

+0

Provato, non ha funzionato. – Nitish