1

私は Download Manager アプリケーションに取り組んでおり、私の構造は次のとおりです。

最初の 1 つはユーティリティに関するすべてのアクティビティとフォアグラウンドである 2 つのパッケージがあります。(Activities、ListAdapters など) そして 2 つ目は、すべてのバックグラウンド アクティブ クラスを含むパッケージです。(ダウンロード スレッドには、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;
    }
}

アダプターのパフォーマンスを向上させるためにDownloadViewHolder、参照を保持するようにクラスを宣言しています (不要なインフレを避けるため)。ListView の項目をクリックすると、LogCat の出力が理解できません:-/ ! 2 番目Log.eは、listView に追加された最後の項目を常に出力するためです。なにが問題ですか?

誰かが解決するために私を案内してもらえますか?

前もって感謝します :)

4

1 に答える 1

1

あなたのコードに問題があります。発生をクリックすると、リスナーがホルダーを取得しますが、最後に表示されたリスト項目のホルダーです。これを防ぐには、getView() でホルダーを作成し、コンストラクターを介して onClickListener に渡す必要があります。

于 2012-09-01T14:54:16.433 に答える