0

アダプターがあり、アダプター内に非同期タスクがあります。表示レイアウト バッジの読み込みが速く、スクロールすると値がランダムに変化します。

私のアダプター

private class MyAdapter extends ArrayAdapter<MyClass> {
        ConvertView holder = null;


        public MyAdapter(Context context, int resource, int textViewResourceId, List<MyClass> objects) {
            super(context, resource, textViewResourceId, objects);
            mInflater = LayoutInflater.from(context);

        }

        public int getCount() {

            return myclassList.size();
        }

        public MyClass getItem(int position) {
            return myclassList.get(position);
        }

        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final TextView txtTestKode, txtTestName, txtTestStatus;
            final RelativeLayout layoutBadge;

            final MyClass data = getItem(position);


            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.row_test_transaction, null, false);
                holder = new ConvertView(convertView);
                convertView.setTag(holder);
            } else {
                holder = (ConvertView) convertView.getTag();
            }

            txtTestKode = holder.getTxtTestKode();
            txtTestName = holder.getTxtTestName();
            txtTestStatus = holder.getTxtTestStatus();


            new AsyncTask<String, Void, String>() {
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }

                @Override
                protected String doInBackground(String... params) {
                    try {
                        String url = "my_url";
                        WebRequestPost req = new WebRequestPost(url);


                        req.execute();

                        BufferedReader reader = new BufferedReader(new InputStreamReader(req.getResultStream()));
                        String result = reader.readLine();
                        reader.close();
                        req.closeStream();

                        return result;
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (SQLiteConstraintException e) {
                        e.printStackTrace();
                    } catch (SQLiteException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return null;
                }

                @Override
                protected void onPostExecute(String results) {
                    super.onPostExecute(results);
                    if (results != null) {
                        if (Integer.parseInt(results) > 0) {
                            holder.getLayoutBadge().setVisibility(View.VISIBLE);
                        }
                    }
                }
            }.execute();

            return convertView;
        }


    }

と:

public static class ConvertView {
        private View row;

        private RelativeLayout layoutBadge;

        public ConvertView(View row) {
            this.row = row;
        }


        public RelativeLayout getLayoutBadge() {
            if (layoutBadge == null) {
                layoutBadge = (RelativeLayout) row.findViewById(R.id.layoutBadge);
            }
            return layoutBadge;
        }


    }

ありがとう

4

1 に答える 1

0

アダプタでこれらの種類のタスクを実行しないでください。何が起こっているかというと、データが非同期にフェッチされており、後でいつでも利用できる可能性があります (データがランダムに変更されます)。アダプターは引き続き他の行データをロードし、非同期で実行しているため、各行タスクが完了するのを待ちません。

ベスト プラクティスは、アダプターを作成する前にデータを提供し、そのデータをリストとしてコンストラクター引数としてアダプターに送信することです。

于 2016-10-05T08:08:31.123 に答える