0

データのリストを収集する を起動する がありFragmentActivityます。AsyncTaskこのアクティビティには がListFragmentあり、データが来るたびにリストビューを更新したいと考えています。

データを取得する必要がある別のフラグメントがあるため、要素がリストに追加されたときに両方が通知されるように、オブザーバー パターンのクイック バージョンを実装しました。

private void addElement(MyListElement item) {
    myList.add(item);
        Collections.sort(myList, Collections.reverseOrder());   
        notifyObservers();
}
private void notifyObservers() {
    for(IListObserver dObserver: observers){
          dObserver.updateList(myList);
    }
}

しかし、私のリストは決して更新されません (または、別のフラグメント)。

ListFragment コードは次のとおりです。

public class MyListFragment extends SherlockListFragment implements IListObserver{

    private TextView first;
    private Context mContext;
    private List<MyListElement> myList;
    private MyListAdapter myListAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        this.mContext = getActivity().getApplicationContext();

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_listview, container, false);



            myList = new ArrayList<SizeDirectory>(0);
        myListAdapter = new MyListAdapter(getActivity(), myList);
        setListAdapter(myListAdapter);
        myListAdapter.notifyDataSetChanged();


        return view;
    }





    @Override
    public void updateList(List<MyListElement> myList) {
        this.myList = myList;
        this.myListAdapter.notifyDataSetChanged();
        getListView().requestLayout();
    }
}

これが AsyncTask です。

class ListLoader extends AsyncTask<String, MyListElement, Boolean> {

    private String LOG_TAG = ListLoader .class.getSimpleName();

    /**
     * Maybe show loading indicator
     */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

    }


    protected Boolean doInBackground(String... args) {

                     MyListElement item = getListItem(...)
                     publishProgress(item );

        return true;
    }

    /**
     * After completing background task Dismiss the progress dialog
     **/
    protected void onPostExecute(Boolean result) {
        if (result) {
            //Everything was ok
        }
    }

    @Override
    protected void onProgressUpdate(MyListElement... values) {
        super.onProgressUpdate(values);
        addElement(values[0]);
    }

}

面白いことに、これAsyncTaskを myに入れ、そこからListFragment呼び出すと、asynctask の進行に合わせてリストが更新されます。updateList

これは、アクティビティを作成した後に Fragment の onCreateView を呼び出すアクティビティ ライフサイクルが原因である可能性があります (したがって、リストをリセットします) が、デバッガーで確認しましたが、そうではありません。また、これは onProgressUpdate から行うため、別のスレッドから UI を更新できないこととは関係がないと想定しています。

編集:layout_listview

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
        <TextView
            android:id="@+id/firstTextView"
            android:layout_width="fill_parent"
            android:layout_height="129dp"
            android:scrollbars="vertical"
            android:text="@string/hello_world" />

        <Button
            android:id="@+itd/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="Button" />

    </RelativeLayout>

    <ListView
        android:id="@id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>
4

1 に答える 1

0

updateList() 呼び出しの後、リスト アダプターは myList の元の値への参照を保持しています。MyListFragment.myList を設定するだけでは、アダプターは更新されません。リストの MyListAdapter のコピーを設定する方法が必要です。これが標準の Android アダプターの 1 つである場合は、新しいリスト用に新しいアダプターを作成し、それをリスト フラグメントに設定する必要がある場合があります。

于 2013-03-07T15:11:29.000 に答える