2013-04-12 4 views
6

screen shot안드로이드 : 위의 이미지에서 목록보기

의 특정 항목에 대한 변경 이미지는 사용자가 다운로드 할 수있는 항목의 목록이 포함 된 목록보기있다. download button 사용자에게 파일을 다운로드 할 수 있음을 알리는 이미지입니다. 다운로드가 완료되면 이미지는 download completed button으로 변경됩니다. 내 문제는 파일을 다운로드 할 때 상태 이미지 (다운로드가 완료되었음을 나타냄)가 다른 행에 대해 변경되고 대신 선택한 행에 대해 변경되어야한다는 것입니다. 현재, 목록에서 첫 번째 파일을 다운로드하면 이미지가 목록의 네 번째 또는 다섯 번째 항목에 대해 변경됩니다. 또한, 목록에서 다른 파일을 다운로드하려고 할 때. 그것은 마지막으로 다운로드 한 파일을 엽니 다 (이것은 파일이 이미 다운로드 된 다음 pdf 리더에서 열리는 응용 프로그램의 기능입니다). 즉, 목록에서 첫 번째 파일을 다운로드 한 다음 두 번째 항목으로 이동하면 두 번째 파일을 다운로드하는 대신 파일을 열면 마지막으로 다운로드 한 파일이 열립니다. 목록보기를 스크롤하면 목록의 다른 항목에 대해서도 다운로드 상태가 변경됩니다. 나는 (깊이 explaination에 대한 Knickedi 덕분에)보기를 재활용 this post을 읽은

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 

: 아래, 내 어댑터 코드입니다. 그러나, 나는 실제적인 문제가 어디에 있는지 알 수 없다.

답변

5

문제는보기를 스크롤 할 때마다, 당신은 setTag & getTag 함께 플레이해야 정확한 위치를 처리하기 위해 다시 보관 방법 getview으로, setTag & getTag을 이해하는 몇 stackvoerflow 답변 아래 확인 :

Button in ListView using ArrayAdapter

Getting radio button value from custom list in android

을 다운로드하고 다운로드 한 상태를 아래와 같이 booleanarray에 저장하십시오.

int boxState[]; 
어댑터 생성자 내에서

는 0에 초기화 설정 :

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

    } 

어댑터의 getView 방법 내 :

:

holder.imgDownload.setTag(position); 

지금 당신은 (버튼의 onclick을 내부) 1로 다운로드 버튼 설정 값을 클릭

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

마지막으로보기 확인 조건을 다음과 같이 스크롤 할 때 (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

감사합니다. 작동하지만 지금은 또 하나의 문제에 직면하고 있습니다. 첫 번째 항목의 버튼을 클릭하여 파일을 다운로드하면 올바른 파일이 다운로드됩니다. 그러나 동일한 버튼을 다시 클릭하면 파일을 여는 대신 첫 번째 행에서 마지막 파일을 다운로드합니다. 제가 말하고자하는 것은 한 번에 6 개 항목이 목록에 표시된다는 것입니다. 첫 번째 항목의 버튼을 클릭하면 올바른 파일을 다운로드하지만 다시 클릭하면 목록보기에서 여섯 번째 항목의 URL과 관련된 파일을 다운로드합니다. 내 코드를 업데이트했다. – Nitish

+0

그냥'holder.imgDownload.setTag (position);이 줄의 위치를 ​​바꾼다. 버튼을 onclick하기 전에 유지하고 체크한다. – RobinHood

+0

시도했다, 일하지 않았다. – Nitish