我正在开发下载管理器应用程序,我的结构如下:
我有两个包,第一个是关于实用程序的所有活动和前景。(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。