Android: Ändern des Bilds für ein bestimmtes Element in der listview

Android: Ändern des Bilds für ein bestimmtes Element in der listview

Im Bild oben, dort befindet sich eine Liste, die enthält eine Liste der Elemente, die der Benutzer herunterladen kann. Android: Ändern des Bilds für ein bestimmtes Element in der listview. Mein problem ist, wenn ich eine Datei herunterladen, die status-Bild(was bedeutet, dass der download abgeschlossen wurde) verändert wird, die für eine weitere Zeile, stattdessen sollte es die änderung für die Zeile, die ich ausgewählt hatte. Zur Zeit, wenn ich download der ersten Datei in der Liste, wird das Bild wieder geändert für den 4. oder 5. Element in der Liste. Auch, wenn ich versuche zu downloaden jede andere Datei aus der Liste. es öffnet sich bis zuletzt heruntergeladenen Datei(Diese ist die Funktionalität der app, dass wenn die Datei bereits heruntergeladen haben, dann öffnen Sie es im pdf-reader),d.h., wenn ich download 1. Datei in der Liste und gehen Sie dann zum zweiten Punkt,dann statt dem herunterladen 2. die Datei, es öffnet sich bis zuletzt heruntergeladenen Datei. Mehr über, wenn ich das scrollen der listview, der status des downloads wird geändert für die anderen Elemente in der Liste auch. Unten ist mein 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

Hatte ich gelesen dieser Beitrag für das recycling der Ansicht(Dank Knickedi für weiterführende Erläuterungen). Aber ich kann nicht herausfinden, wo ist das eigentliche problem.

InformationsquelleAutor Nitish | 2013-04-12
Schreibe einen Kommentar