-1

4 秒ごとに項目を追加し、最後の項目にフォーカスを設定する ListView を作成したいと考えています。問題は、asynctask の Fragment 待機が終了してから表示されることです (常に asynctask が白い画面で動作します)。

 public class LogFragment extends SherlockFragment {
    private ListView lvList;
    private ArrayAdapter<String> adapter;
    private UpdateTask mTask = null;
    String[] values = new String[] { "Android", "iPhone", "WindowsMobile" };
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.log_fragment, container, false);
        lvList = (ListView) view.findViewById(R.id.lvLog);
        final ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < values.length; ++i) {
            list.add(values[i]);
        }
        adapter = new ArrayAdapter<String>(getSherlockActivity(),
                android.R.layout.simple_list_item_1, list);
        lvList.setAdapter(adapter);
        return view;
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d("myLogs", "LogFragment:OnCreate");
        mTask = new UpdateTask();
        super.onCreate(savedInstanceState);
        mTask.execute();
    }

そして AnyncTask -

 public class UpdateTask extends AsyncTask<Void, Void, Void> {
        int temp = 10;

        protected Void doInBackground(Void... params) {
            getSherlockActivity().runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    while (temp-- > 0) {
                        try {
                            TimeUnit.SECONDS.sleep(4);
                            adapter.add("Lol" + String.valueOf(temp));
                            lvList.setSelection(lvList.getAdapter().getCount() - 1);
                            Log.d("myLogs", "Added from Async");
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            });

            return null;

        }

        protected void onPostExecute(String result) {
            // Add code that loops through JSONArray and adds to adapter here

        }
    }

私の問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

notifyDataSetChanged()を呼び出してアダプターのデータを更新します。これにより、ListView に表示される内容が更新されます。また、doInBackground から runOnUiThread を呼び出すのは悪い考えです。そのメソッドは、UI スレッドの外側ですべての重労働を実行するように設計されており、onPostExecute は、タスクの実行が完了したら UI を変更するように設計されています...続く :

protected Void doInBackground(Void... params) {
    TimeUnit.SECONDS.sleep(4);
    adapter.add("Lol" + String.valueOf(temp));
    Log.d("myLogs", "Added from Async");
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;

}

protected void onPostExecute(String result) {
    // Add code that loops through JSONArray and adds to adapter here
    lvList.setSelection(lvList.getAdapter().getCount() - 1);
    adapter.notifyDataSetChanged();
}
于 2013-11-09T20:38:54.753 に答える