Android: change image for specific item in list

screen shot

The above image has a list containing a list of items that the user can download. download button This is an image that tells the user that he can download the file. When the download is complete, the image will change to download completed button . My problem is that when I upload a file, the status image (which means the download is completed) changes to another line, instead it should change for the line I selected. Currently, if I upload the first file to the list, the image changes to the 4th or 5th element in the list. Also, when I try to load any other file from the list. it opens the last downloaded file (this is the functionality of the application, if the file is already downloaded, then open it in a PDF reader), that is, if I load the 1st file into the list and then go to the second element, then instead of downloading the second file, it opens the last downloaded file. Moreover, if I look at the list, the download status also changes for other items in the list. Below is the adapter code:

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 

I read this post for reusing the view (thanks to Knickedi for the detailed explanation). But I can’t understand where the actual problem is.

+6
source share
1 answer

Problem with getview A method that saves a recreation whenever you view your view to handle the exact position you must play with setTag & getTag , check out a few stackvoerflow answers below to understand setTag & getTag :

Button in ListView using ArrayAdapter

Getting switch value from user list in android

and even save the loaded state into a single booleanarray , as shown below:

 int boxState[]; 

inside the adapter constructor, first set to zero:

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

inside the getview method:

 holder.imgDownload.setTag(position); 

Now you click on the setting of the download button as 1 (inside the onclick button):

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

Finally, when you view the condition for checking a view as follows (enter the code below inside the getview method):

 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. } 
+5
source

All Articles