2013-04-12 30 views
6

screen shotAndroid: Thay đổi hình ảnh cho một mục cụ thể trong chế độ xem danh sách

Trong hình ảnh ở trên, có danh sách các mục mà người dùng có thể tải xuống. download button Đây là hình ảnh cho người dùng biết rằng anh ấy có thể tải xuống tệp. Khi hoàn thành tải xuống, hình ảnh sẽ thay đổi thành download completed button. Vấn đề của tôi là khi tôi tải xuống một tệp, hình ảnh trạng thái (biểu thị rằng tải xuống đã hoàn tất) được thay đổi cho một hàng khác, thay vào đó, nó sẽ thay đổi cho hàng mà tôi đã chọn. Hiện tại, nếu tôi tải xuống tệp đầu tiên trong danh sách, hình ảnh sẽ được thay đổi cho mục thứ 4 hoặc thứ 5 trong danh sách. Ngoài ra, khi tôi cố tải xuống bất kỳ tệp nào khác từ danh sách. nó mở ra tập tin tải xuống mới nhất (Đây là chức năng của ứng dụng nếu tập tin đã được tải xuống, sau đó mở nó trong trình đọc pdf), tức là, nếu tôi tải xuống tập tin thứ nhất trong danh sách và sau đó đi cho mục thứ hai, sau đó thay vì tải về thứ 2 tệp, nó sẽ mở ra tệp được tải xuống lần cuối. Hơn thế nữa, nếu tôi cuộn chế độ xem danh sách, trạng thái tải xuống sẽ được thay đổi cho các mục khác trong danh sách. Dưới đây, là mã bộ chuyển đổi của tôi:

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 

tôi đã đọc this post cho tái chế xem (Nhờ Knickedi cho sâu Giải thích). Nhưng, tôi không thể tìm ra đâu là vấn đề thực sự.

Trả lời

5

Issue với getview Phương pháp mà giữ tái tạo bất cứ khi nào bạn di chuyển tầm nhìn của bạn, để xử lý các vị trí chính xác mà bạn phải chơi với setTag & getTag, kiểm tra dưới đây vài stackvoerflow câu trả lời để hiểu setTag & getTag:

Button in ListView using ArrayAdapter

Getting radio button value from custom list in android

và thậm chí lưu trữ trạng thái đã tải xuống thành một số booleanarray như sau:

int boxState[]; 

trong constructor bộ chuyển đổi, thiết lập zero ban đầu:

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

    } 

trong phương pháp tiếp hợp getview:

holder.imgDownload.setTag(position); 

Bây giờ bạn bấm vào tải về giá trị nút ấn định là 1 (Bên trong onclick nút):

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

Cuối cùng khi bạn cuộn chế độ xem, hãy kiểm tra điều kiện theo cách sau (đặt bên dưới mã bên trong phương thức 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

Cảm ơn, nó hoạt động nhưng bây giờ tôi đang gặp phải một vấn đề nữa. Nếu tôi nhấp vào nút của mục đầu tiên để tải xuống tệp, tệp đang tải xuống tệp chính xác. Nhưng, khi tôi bấm vào cùng một nút một lần nữa, trong hàng đầu tiên, thay vì mở tập tin, nó tải tập tin cuối cùng. Những gì tôi có nghĩa là để nói, là tại một thời điểm, sáu mặt hàng có thể nhìn thấy trong danh sách. Khi nào, tôi bấm vào nút trong mục đầu tiên, nó tải tập tin chính xác, nhưng khi tôi bấm vào nó một lần nữa, nó tải tập tin liên kết với url của mục 6 trong danh sách xem. Tôi đã cập nhật mã của mình. – Nitish

+0

Chỉ cần thay đổi vị trí của dòng này 'holder.imgDownload.setTag (vị trí);' giữ trước khi onclick của nút và sau đó kiểm tra – RobinHood

+0

Cố gắng, đã không làm việc. – Nitish