ListView and ReferenceHolder



我正在开发下载管理器应用程序,我的结构如下:

我有两个包,第一个是关于实用程序的所有活动和前景。(Activities、ListAdapters等)第二个包包含所有后台活动类。(下载线程包括FTP、HTTP、HTTPS等)。

此外,为了保存下载文件的详细信息,我定义了如下类:

public class DownloadInfo {
    public DownloadInfo(String url, int connection, int progress, boolean status) {
        this.M_url = url;
        this.M_connection = connection;
        this.M_progress = progress;
        this.B_status = status;
    }
    String M_url;
    int M_connection;
    int M_progress;
    boolean B_status;
}

以及保持下载/下载文件列表的ArrayList<DownloadInfo>。为了初始化ListView,我声明了从ArrayAdapter<DownloadInfo>继承的类如下:

public class FillDownloadList extends ArrayAdapter<DownloadInfo> {
    private ArrayList<DownloadInfo> M_dlList;
    private Context M_context;
    private DownloadViewHolder holder;
    public FillDownloadList(Context context, ArrayList<DownloadInfo> dlList) {
        super(context, R.layout.download_item, dlList);
        this.M_dlList = dlList;
        this.M_context = context;
    }
    public View getView(final int position, View convertView,
            android.view.ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.download_item, parent,
                    false);
            holder = new DownloadViewHolder();
            holder.activityButton = ((Button) convertView
                    .findViewById(R.id.dl_button));
            holder.linkText = ((TextView) convertView
                    .findViewById(R.id.link_textview));
            holder.speedText = ((TextView) convertView
                    .findViewById(R.id.speed_textview));
            holder.percentBar = ((ProgressBar) convertView
                    .findViewById(R.id.dl_progressbar));
            convertView.setTag(holder);
        } else {
            holder = (DownloadViewHolder) convertView.getTag();
        }
        holder.linkText.setText(this.M_dlList.get(position).M_name);
        holder.percentBar.setProgress(this.M_dlList.get(position).M_progress);
    // Doing some initializing and setting the download thread based on DownloadInfo `B_status` parameter.
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("log", M_dlList.get(position).M_url);
                Log.e("log", System.out.println(holder.linkText.getText());
            }
        });
        return convertView;
    }
    private static class DownloadViewHolder {
        TextView linkText;
        TextView speedText;
        Button activityButton;
        ProgressBar percentBar;
    }
}

为了提高Adapter的性能,我声明DownloadViewHolder类来保留引用(以避免不必要的膨胀)。当我点击ListView的项目时,LogCat的输出对我来说是不可理解的:-/!因为第二个Log.e总是打印添加到listView的最后一个项目。怎么了?

有谁能帮我解决吗?

提前感谢:)

您的代码有一个问题,当您单击偶发事件时,单击listener会拾取holder,但它是上次查看的列表项中的holder,为了防止它,您必须在getView()中创建holder,并通过构造函数将其传递给onClickListener。

最新更新