2012-08-13 2 views
0

이미지가 포함 된 격자가 있습니다. 이미지 클릭시, 책 다운로드가 시작됩니다. 다운로드가 진행 중이고 해당 이미지를 클릭하면 다운로드가 시작됩니다. 이로 인해 결과 파일이 손상됩니다. 다운로드 작업은 이미지의 onClick 이벤트에 적용되었습니다. 첫 번째 이미지를 false로 설정하고 false를 setEnable로 만들려고했습니다. 그러나 양쪽 방법은 나를 위해 일하지 않았다. 다운로드가 진행 중일 때도 이미지 클릭이 작동합니다. 안내해주십시오. 나는의 appserv의 답변을 좋아처음 클릭 할 때 프로세스가 진행 중일 때 이미지보기에서 클릭 이벤트를 비활성화하는 방법

public class GridViewAdapter extends BaseAdapter { 
    ImageView imageView; 
    private Context context; 
    private int item; 
    private LayoutInflater layoutInflater; 

    GridViewAdapter(Context c, int griditem) { 
     this.context = c; 
     this.item = griditem; 
     this.layoutInflater = (LayoutInflater) c 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 

     return bank.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return bank.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup arg2) { 
     View grid; 

     Display display = ((WindowManager) context 
       .getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

     int orientation = display.getOrientation(); 

     if (convertView == null) { 
      grid = new View(context); 
      grid = layoutInflater.inflate(item, null); 
     } else { 
      grid = (View) convertView; 
     } 

     final TextView title = (TextView) grid.findViewById(R.id.mgntitle); 
     title.setText(bank.get(position).getTitle()); 
     imageView = (ImageView) grid.findViewById(R.id.thumbnail); 
     imageView.setImageResource(R.drawable.icon); 
     final ProgressBar progress = (ProgressBar) grid 
       .findViewById(R.id.progress); 
     final ImageView downloadmark = (ImageView) grid 
       .findViewById(R.id.downloadmark); 
     String pdfLink = bank.get(position).getPdfLink(); 
     String filename = pdfLink.substring(pdfLink.lastIndexOf("/") + 1); 

     final File targetDir = new File(fileLocation + filename); 

     if(targetDir.exists()){ 
      downloadmark.setVisibility(View.VISIBLE); 

     } 
     imageView.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       if (!targetDir.exists()) { 
        if (isInternetConnected()) { 
         map.put(bank.get(position).getTitle(), progress); 
         new DownloadPdfFile(GridDisplayActivity.this, bank 
           .get(position).getPdfLink(), progress, 
           downloadmark, imageView).execute(); 
        } else { 
         setAlertBox("You are not connected to Internet. Please switch your connection ON to be able to Downlaod Bespoken Magazines"); 
        } 
       } else { 

        Toast.makeText(context, "File exists", 
          Toast.LENGTH_LONG).show(); 

        // Book opening intent has to be fried here 
       } 
      } 

     }); 



     imageView.setImageBitmap(BitmapFactory.decodeByteArray(
       bank.get(position).getCoverPages(), 0, bank.get(position) 
         .getCoverPages().length)); 

     if (!getPrefName(filename).equalsIgnoreCase("NA")) { 
      if (new File(fileLocation + filename).exists()) { 
       // tag.setImageResource(R.drawable.bookmark); 
       downloadmark.setVisibility(View.VISIBLE); 

      } else { 
       SharedPreferences pref = getApplicationContext() 
         .getSharedPreferences("BESPOKEN_PREF", 
           MODE_WORLD_WRITEABLE); 
       SharedPreferences.Editor editor = pref.edit(); 
       editor.putString(filename, "NA"); 
       editor.commit(); 

      } 
     } 

     if (new File(fileLocation + filename).exists()) { 
      if (!getPrefName(filename).equalsIgnoreCase("NA")) { 
       // tag.setImageResource(R.drawable.bookmark); 
      // downloadmark.setVisibility(View.VISIBLE); 

      } else { 

      } 

     } 

     return grid; 

    } 
} 

private String getPrefName(String name) { 
    SharedPreferences pref = this.getSharedPreferences("BESPOKEN_PREF", 
      MODE_WORLD_WRITEABLE); 
    return pref.getString(name, "NA"); 
} 

private void saveBookName(String title) { 
    SharedPreferences pref = this.getSharedPreferences("BESPOKEN_PREF", 
      MODE_WORLD_WRITEABLE); 
    SharedPreferences.Editor editor = pref.edit(); 
    editor.putString(title, title); 
    editor.commit(); 
} 

private boolean isInternetConnected() { 
    connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
    mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    mMobile = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    return mWifi.isConnected() || mMobile.isConnected(); 
} 

private class DownloadPdfFile extends AsyncTask<Void, Integer, Void> { 

    private int progressupdate; 
    String link; 
    ProgressBar progress; 
    ImageView cover; 
    String file; 
    ImageView dwnloadmark; 

    public DownloadPdfFile(GridDisplayActivity activity, String link, 
      ProgressBar progressbar, ImageView dwnmrk, ImageView imageView) { 
     imageView.setEnabled(false); 
     progress = progressbar; 
     this.link = link; 
     this.cover = imageView; 
     this.dwnloadmark = dwnmrk; 

    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     cover.setEnabled(false); 
     progress.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 


     file = link.substring(link.lastIndexOf("/") + 1); 
     InputStream is = null; 
     long startTime = 0; 
     int count; 
     // DownloadFromUrl(link, fileLocation + file,progress); 
     try { 

      URL url = new URL(link); 
      File dir = new File(fileLocation); 
      if (dir.exists()) { 

      } else { 
       Log.i("", 
         "---------targetDir not .exists()----------------4"); 
       dir.mkdirs(); 
      } 
      URLConnection conexion = url.openConnection(); 
      conexion.connect(); 

      int lenghtOfFile = conexion.getContentLength(); 
      Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream(fileLocation + file); 

      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 (IOException e) { 
      e.printStackTrace(); 

     } 
     Log.d("ImageManager", 
       "download ready in" 
         + ((System.currentTimeMillis() - startTime)/1000) 
         + " sec"); 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... prog) { 
     progressupdate = prog[0]; 
     progress.setProgress(progressupdate); 

    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     dwnloadmark.setVisibility(View.VISIBLE); 
     // tag.setImageResource(R.drawable.bookmark); 
     progress.setVisibility(View.INVISIBLE); 
     saveBookName(file); 
     cover.setEnabled(true); 
    } 

} 



class DoBackgroundTask extends CustomAsyncTask<Void, Integer, Void> { 
    private static final String TAG = "DoBackgroundTask"; 

    private int progressupdate; 
    String link; 
    private ProgressBar progress; 
    ImageView dwnloadmark; 
    ImageView cover; 
    String file; 
    GridDisplayActivity activity; 

    public DoBackgroundTask(GridDisplayActivity activity, String link, 
      ProgressBar progressbar, ImageView dwnmrk, ImageView img) { 
     super(activity); 
     img.setEnabled(false); 
     this.activity = activity; 
     progress = progressbar; 
     this.link = link; 
     this.dwnloadmark = dwnmrk; 
     this.cover = img; 

    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     cover.setEnabled(false); 
     progress.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected void onActivityDetached() { 
     if (progress != null) { 
      //progress.setActivated(false); 
      // progress = null; 
     } 
    } 

    @Override 
    protected void onActivityAttached() { 

     //progress.setActivated(true); 
     progress.setVisibility(View.VISIBLE); 
     progress.setProgress(progressupdate); 
     // showProgressDialog(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     file = link.substring(link.lastIndexOf("/") + 1); 
     InputStream is = null; 
     long startTime = 0; 
     int count; 
     // DownloadFromUrl(link, fileLocation + file,progress); 
     try { 

      URL url = new URL(link); 
      File dir = new File(fileLocation); 
      if (dir.exists()) { 

      } else { 

       dir.mkdirs(); 
      } 
      URLConnection conexion = url.openConnection(); 
      conexion.connect(); 

      int lenghtOfFile = conexion.getContentLength(); 
      Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream(fileLocation + file); 

      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 (IOException e) { 
      e.printStackTrace(); 

     } 
     Log.d("ImageManager", 
       "download ready in" 
         + ((System.currentTimeMillis() - startTime)/1000) 
         + " sec"); 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... prog) { 

     progressupdate = prog[0]; 

     if (mActivity != null) { 
      progress.setProgress(progressupdate); 
     } else { 
      Log.d(TAG, "Progress updated while no Activity was attached."); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     dwnloadmark.setVisibility(View.VISIBLE);  
     cover.setEnabled(true); 
     saveBookName(file); 

     if (mActivity != null) { 
      progress.setVisibility(View.INVISIBLE); 
      Toast.makeText(mActivity, "AsyncTask finished", 
        Toast.LENGTH_LONG).show(); 
     } else { 

     } 
    } 
} 

답변

4
public class GridViewAdapter extends BaseAdapter { 


    private boolean _buttonPressed = false; 


    ..... 

    imageView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if(_buttonPressed){ 
       return; 
      } 
      _buttonPressed = true; 
      ......... 

    ..... 


    private class DownloadPdfFile extends AsyncTask<....> { 
      ..... 
      @Override 
      protected void onPostExecute(....) { 
       _buttonPressed = false;  
      } 
      ..... 
    } 
} 
+0

,하지만 난 두 가지를 제안 : 은 자세한 내용은 여기 내 코드입니다. 먼저, 시각적 피드백을 절대적으로 제공하여 사용자가 무언가가 백그라운드에서로드되고 있음을 알고 있어야합니다. 버튼을 회색으로 표시하고 "로드 중 ..."이라는 단어 또는 핀 바람 애니메이션을 오버레이합니다. 둘째, _buttonPressed를 설정 한 곳에서 button.setEnabled()를 사용해야합니다. –

+0

@Edward 여기에서 사용하는 위젯은 버튼이 아니라 이미지입니다. 다운로드가 진행 중일 때 상태 업데이트로 가로 진행률 막대를 구현했습니다. 내 문제는 한 번 클릭 한 후에도 이미지를 클릭 할 수 있다는 것이 었습니다. 그 때문에 다운로드가 다시 시작되고 손상된 파일이 다운로드됩니다. –

+0

이미지 버튼을 클릭 할 수 없게 만들 수 있어야합니다. setClickable() 또는 setEnabled()를 조사하십시오. 다른 모든 것이 실패하면 appserv의 대답은 여전히 ​​좋은 것입니다. 우수한 작업, 진행률 표시 줄 구현, BTW; 탁월한 UI 아이디어처럼 들립니다. –

관련 문제