0

アクティビティでデータベースからリストを表示するために ListFragment を使用しています。検索機能を入れました。残念ながら、「古い」ListFragments はバックグラウンドに残っているようで、クエリの結果を含む ListFragments がその上に表示されます。古い ListFragments が表示されないようにするにはどうすればよいですか?

私のフラグメントアクティビティ:

private Button buttonSearch; 
    private TextView searchString; 
    public static String search = null; 
    static IShoppinglist shoppinglistManager;
    static IAktionen aktionenManager; 
    private AktionenListListFragment listFragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "ListFragmentActivity created"); 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.articlelist);

        shoppinglistManager = new Shoppinglist(this);
        aktionenManager = new Aktionen(this); 

        buttonSearch = (Button) findViewById(R.id.search_Button);
        buttonSearch.setOnClickListener(searchListAktionen);

        //show all entries on start
        listFragment = new AktionenListListFragment();
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_articlelist, listFragment).commit();
    }   

    OnClickListener searchListAktionen = new OnClickListener() {
        public void onClick(View v) {


            try{
                searchString = (TextView) findViewById(R.id.input_search_bezeichnung); 
                search = searchString.getText().toString().trim();
                Log.d(TAG, "search Button clicked "+search); 

                if(search.trim().length()==0){
                    search=null;
                }

                //show all entries on start
                listFragment = new AktionenListListFragment();
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_articlelist, listFragment).commit();

            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    };

前もって感謝します、

アップデート:

回答ありがとうございます。私はそれらを実装しようとしましたが、主な問題は、ListFragment の onCreate メソッドと onActivityCreated メソッドが 2 回呼び出されることです (ログ メッセージで確認できます)。

私の新しいコード:

@Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "ListFragmentActivity created"); 
        super.onCreate(savedInstanceState);

        //force commit
        getSupportFragmentManager().executePendingTransactions();


        if(getSupportFragmentManager().findFragmentByTag(tag) == null) {
            setContentView(R.layout.articlelist);

            shoppinglistManager = new Shoppinglist(this);
            aktionenManager = new Aktionen(this); 

            buttonSearch = (Button) findViewById(R.id.search_Button);
            buttonSearch.setOnClickListener(searchListAktionen);
            listFragment = new AktionenListListFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_articlelist, listFragment,tag).commit();
        }else{
            Log.d(TAG, "ListFragment already exists"); 
        }
    }

ListFragment に一意のタグを設定しようとしましたが、この解決策は機能しません。

ListFragments の 1 つがバックグラウンドで表示され、もう 1 つが更新されていると思います。

4

1 に答える 1

2

したがって、最初に、リストが更新されるたびに新しい ListFragments の作成を停止し、適切なパラメーターを使用してローダーを再起動するためにアクティビティが呼び出すことができる ListFragment にパブリック メソッドを用意する必要があります。それで:

onLoadFinished() で、

置き換えたいリストで新しいアダプターを作成する必要があります

myAdapter = new AktionenListCustomCursorAdapter(getActivity(), myCursor);

そして呼び出します:

this.getListView().setAdapter(myAdapter);

そう:

    public void onLoadFinished(Loader<Cursor> mAdapter, Cursor myCursor) {
                if(myCursor!=null){
                    //getting the data from the database
                    Log.d(TAG, "search String "+AktionenListFragmentActivity.search);
                    if(AktionenListFragmentActivity.search==null){
                        myCursor = AktionenListFragmentActivity.aktionenManager.fetchAllArticles();
                    }else{
                        myCursor = AktionenListFragmentActivity.aktionenManager.fetchItemsByBezeichnung(AktionenListFragmentActivity.search);
                    }
myAdapter = new AktionenListCustomCursorAdapter(getActivity(), myCursor);
                    this.getListView().setAdapter(myAdapter);
                }
            }

私が理解したように、これであなたの質問が解決したことを願っています。質問がある場合は、下のコメントに残してください。回答を拡大します。うまくいった場合は、回答を受け入れてください。:D

于 2013-02-13T19:41:50.230 に答える