2013-04-12 118 views
6

screen shot安卓:在列表视图

在上图中为特定项目更改图像,有包含用户可以下载的项目列表的列表视图。 download button这是告诉用户他可以下载文件的图像。完成下载后,图像将更改为download completed button。我的问题是,当我下载一个文件时,状态图像(表示下载已完成)在另一行进行了更改,相反,它应该更改为我选择的行。目前,如果我下载列表中的第一个文件,则图像将在列表中的第4个或第5个项目中更改。另外,当我尝试从列表中下载任何其他文件时。它打开最后下载的文件(这是应用程序的功能,如果文件已经下载,然后用pdf阅读器打开它),也就是说,如果我从列表中下载第一个文件,然后转到第二个项目,那么不要下载第2个文件文件,它会打开上次下载的文件。更重要的是,如果我滚动列表视图,下载的状态也会被更改为列表中的其他项目。下面是我的适配器代码:

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 

我为(深度交代感谢Knickedi的)回收的观点看this post。但是,我无法弄清楚实际问题在哪里。

回答

5

问题与getview方法,保持重建每当你滚动视图,来处理你有setTag & getTag玩确切位置,检查以下几个stackvoerflow答案,了解setTag & getTag

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); 

现在你在下载按钮设定值单击为1(内部按钮的onclick):

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项相关联的文件。我更新了我的代码。 – Nitish

+0

只需更改此行的位置'holder.imgDownload.setTag(位置);'保存按钮之前的onclick然后检查 – RobinHood

+0

试过,没有工作。 – Nitish