Android:更改listview中特定项目的图像

Android:更改listview中特定项目的图像,android,android-listview,baseadapter,Android,Android Listview,Baseadapter,在上图中,有一个列表视图,其中包含用户可以下载的项目列表。这是告诉用户他可以下载文件的图像。下载完成后,图像将更改为。我的问题是,当我下载一个文件时,另一行的状态图像(表示下载已完成)会发生更改,而我选择的行的状态图像应该会发生更改。目前,如果我下载列表中的第一个文件,图像将更改为列表中的第四项或第五项。另外,当我试图从列表中下载任何其他文件时。它打开上次下载的文件(这是应用程序的功能,如果文件已下载,则在pdf阅读器中打开),即,如果我下载列表中的第一个文件,然后转到第二个项目,则不下载第二个

在上图中,有一个列表视图,其中包含用户可以下载的项目列表。这是告诉用户他可以下载文件的图像。下载完成后,图像将更改为。我的问题是,当我下载一个文件时,另一行的状态图像(表示下载已完成)会发生更改,而我选择的行的状态图像应该会发生更改。目前,如果我下载列表中的第一个文件,图像将更改为列表中的第四项或第五项。另外,当我试图从列表中下载任何其他文件时。它打开上次下载的文件(这是应用程序的功能,如果文件已下载,则在pdf阅读器中打开),即,如果我下载列表中的第一个文件,然后转到第二个项目,则不下载第二个文件,而是打开上次下载的文件。此外,如果我滚动listview,列表中其他项目的下载状态也会改变。下面是我的适配器代码:

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
公共类DownloadListAdapter扩展了BaseAdapter{
上下文ctx;
公共ArrayList mDownloadList;
字符串readMoreLink;
公共静态最终字符串标记=“DownloadListAdapter”;
进程对话框;
私有布尔isSDCardPresent;
文件tieDir;
int下载状态[];
公共下载列表适配器(上下文ctx,
ArrayList(mDownloadList){
this.ctx=ctx;
this.mDownloadList=mDownloadList;
downloadState=newint[mDownloadList.size()];
对于(int i=0;i0){
if(mDownloadList.get(position).getTitle()!=null
&&!mDownloadList.get(position).getTitle().equals(“null”)
&&!mDownloadList.get(position.getTitle().equals(“”){
holder.txtitle.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(下载状态[位置]==1){
holder.imgDownload.setImageDrawable(ctx.getResources())
.getDrawable(R.drawable.icdload));
}否则{
holder.imgDownload.setImageDrawable(ctx.getResources())
.getDrawable(R.drawable.ic_dload));
}
}
holder.imgDownload.setTag(位置);
返回视图;
}//getView
受保护的void下载文件(字符串url、int位置、字符串文件名){
Log.v(标签“准备下载”);
mProgressDialog=新进度对话框(ctx);
设置消息(“加载…”);
mProgressDialog.setUndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_水平);
isSDCardPresent=Environment.getExternalStorageState().equals(
环境(媒体安装);
如果(!isSDCardPresent){
noSDCardAlert(ctx);
}否则{
如果((tieDir.exists())&&(tieDir!=null)){
if(NetworkConnection.isOnline(ctx)){
if(tieDir.isDirectory()){
Log.v(标记“if-tie-dir-URL::”+URL);
新下载的AudioAsync(ctx,位置,文件名).execute(url);
}
}否则{
((下载列表活动)ctx)
.OpenNetErrDialog(“请检查您的internet连接…”);
}
}否则{
布尔值isDirectoryCreated=tieDir.mkdirs();
我
int boxState[];
for (int i = 0; i < getData.size(); i++) {
    boxState[i] = 0;

    }
holder.imgDownload.setTag(position);
pos = (Integer) v.getTag();
boxState[pos]=1;
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.
        }