0

custom list view各行に2つの画像ビューとテキストビューが含まれているものを使用しています。の方法で使用view holderしています。メソッドの画像ビューの 1 つを設定しましたが、アクティビティでも. 今、クリックすると特定の行に影響しますが、下にスクロールすると、そのクリックによってランダムな行が影響を受けます。Onをクリックすると発生しますが、使用しないと発生しません。なぜこれが起こっているのか、私には本当にわかりません。私を助けてください。getView()custom adapterOnclicklistener()getview()onSelectItemListener()listviewimageviewimageviewviewholder

getView()メソッドのコードは次のとおりです。

public View getView(int position, View convertView, ViewGroup parent) {
    final int myposition = position;
    // TODO Auto-generated method stub

    if (convertView == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.fileviewrowfrnview_layout, null);
        ViewHolder holder = new ViewHolder();
        holder.icon = (ImageView) convertView.findViewById(R.id.icon2);
        holder.text = (TextView) convertView.findViewById(R.id.file_name2);
        holder.download = (ImageView) convertView.findViewById(R.id.play_buttonOropen2);
        convertView.setTag(holder);
    }
    final ViewHolder holder = (ViewHolder) convertView.getTag();


    holder.download.setOnClickListener(new View.OnClickListener() {

        @
        Override
        public void onClick(View v) {
            // TODO Auto-generated method stub  
            if (frnshare_list.get(myposition).getFileType().trim()
                .equalsIgnoreCase("file")) {
                // it is file
                if (frnshare_list.get(myposition).getDownloadStatus().trim()
                    .equalsIgnoreCase("0")) {
                    // is is not a downloaded file do download it
                    holder.icon.setVisibility(View.GONE);
                    holder.download.setVisibility(View.GONE);
                    holder.text.setTextSize(14);

                    Log.e("file to be download", "" + frnshare_list.get(myposition).getFileName());
                    if (frnshare_list.get(myposition).getFileName().length() > 15)
                        holder.text.setText(frnshare_list.get(myposition).getFileName().subSequence(0, 15) + " will be downloaded soon.");
                    else
                        holder.text.setText(frnshare_list.get(myposition).getFileName() + " will be downloaded soon.");
                    UserService us = new UserService(context);
                    Frnshared fdto = frnshare_list.get(myposition);
                    fdto.setDownloadStatus("2"); // in queue
                    fdto.setMessageId("0");
                    us.updateDowloadStatusById(fdto);
                    us.updatemsgIdbyId(fdto);
                    if (CommonUtility.isNetworkAvailable(context)) {
                        AsyncTask < Void, Void, Void > httpconnection = new AsyncTask < Void, Void, Void > () {@
                            Override
                            protected Void doInBackground(Void...params) {
                                // TODO Auto-generated method stub
                                NetworkCommunication nc = new NetworkCommunication(
                                    context);
                                try {
                                    UserService us = new UserService(
                                        context);
                                    Frnshared fdto = frnshare_list
                                        .get(myposition);
                                    Log.i("file to be download", "" + fdto.getFileName());
                                    fdto.setDownloadStatus("2"); // in queue
                                    fdto.setMessageId("0");
                                    us.updateDowloadStatusById(fdto);
                                    us.updatemsgIdbyId(fdto);
                                    String response = nc
                                        .MyHttpPostDownload(frnshare_list
                                        .get(myposition));
                                    ParsersAndDataInsertion.DownloadRequestResponseParser(
                                        response, context,
                                        frnshare_list.get(myposition));

                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                // http call for download
                                return null;
                            }
                        }.execute(null, null, null);
                    }
                    Apitable(adto);
                }

            } else if (frnshare_list.get(myposition)
                .getDownloadStatus().equalsIgnoreCase("1")) {

                Intent intent = new Intent();
                intent.setAction(android.content.Intent.ACTION_VIEW);
                File file = new File(frnshare_list.get(myposition)
                    .getFileLocation());
                intent.setDataAndType(Uri.fromFile(file), "audio/*");

                context.startActivity(intent);

            } else if (frnshare_list.get(myposition)
                .getDownloadStatus().equalsIgnoreCase("2")) {
                Toast.makeText(context, "already request snet", 2000)
                    .show();
            }
        } else if (frnshare_list.get(myposition).getFileType()
            .equalsIgnoreCase("folder")) {}

    }
    });

// view purpose


String file_name = frnshare_list.get(position).getFileName();
if (file_name.length() > 15)
    holder.text.setText(file_name.substring(0, 15) + "");
else
    holder.text.setText(file_name); // frn name

try {
    if (frnshare_list.get(myposition).getFileType()
        .equalsIgnoreCase("file")) { // it is file
        holder.icon.setImageResource(R.drawable.mp3_icon);
        if (frnshare_list.get(myposition).getDownloadStatus()
            .equalsIgnoreCase("0")) {
            Log.i("file is ", "" + frnshare_list.get(myposition).getFileName());
            holder.download.setImageResource(R.drawable.download_png);
        } else if (frnshare_list.get(myposition).getDownloadStatus()
            .equalsIgnoreCase("1")) {

        } else if (frnshare_list.get(myposition).getDownloadStatus()
            .equalsIgnoreCase("2")) {
            Log.i("file is in queue", "" + frnshare_list.get(myposition).getFileName());
            holder.icon.setVisibility(View.GONE);
            holder.download.setVisibility(View.GONE);
            holder.text.setTextSize(14);
            if (frnshare_list.get(myposition).getFileName().length() > 15)
                holder.text.setText(frnshare_list.get(myposition).getFileName().substring(0, 1);
            else
                holder.text.setText(frnshare_list.get(myposition).getFileName() );
        }
    } else if (frnshare_list.get(myposition).getFileType()
        .equalsIgnoreCase("folder")) {
        holder.icon.setImageResource(R.drawable.folder);

    }
} catch (Exception e) {
    // TODO: handle exception
    Intent i = new Intent(context, TabViewActivity.class);
    i.putExtra("show", "frntab");
    context.startActivity(i);

    BugSenseHandler.sendException(e);
    e.printStackTrace();
}


return convertView;
}
4

3 に答える 3

0

ListView から非同期タスクを実行しています。それはトラブルを求めています。これが問題です-ListViewは行をリサイクルします。そのため、タスクが終了するまでに、実際には開始時とはまったく異なる位置を指している可能性があります。非同期タスクが UI にまったく影響を与えないこと、1 つの行を変更するのではなくリスト全体を強制的に再描画すること、またはクリックされた行がは引き続き有効であり、代わりに、ボタンがクリックされたときに行にあった位置を認識し、現在更新する必要がある行を把握します。

基本的に、可能であれば AsyncTasks は避けてください。できない場合は、AsyncTask が UI に触れないようにする必要があります (notifyDataSetChanged の呼び出しを除く)。タスクの過程で必要なデータ (保存先のファイル名など) はローカルにコピーされます。作成時の AsyncTask のメンバー変数であり、行ビューからは読み取られません。

于 2013-05-25T05:47:45.270 に答える
0

あなたのコードはそれを実装する通常の方法だと思いますが、作成時に問題をリサイクルしているためです。

あなたができることは、1.メソッドで直接取得している位置を確認することです-再描画の順序である必要があります2.変換ビューからホルダーを取得したら、ホルダーに既に設定されているコンテンツを再利用する代わりに、のような他のデータ ソースからそのコンテンツを設定すると、List<<>>コンテンツが他のデータ ホルダーにある間、ビューを再作成する時間を節約できます。

于 2013-05-25T06:12:47.147 に答える