2013-02-13 59 views
0

我使用的是ListFragment在我的活动从数据库中显示的列表。我已经包含了一个搜索功能。不幸的是,“旧”ListFragments似乎保留在后台,包含查询结果的ListFragments显示在其后面。我如何避免显示旧的ListFragments?更换ListFragment

我FragmentActivity:

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方法被调用两次(正如我可以在我的日志消息中看到的那样)。

我的新代码:

@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的一个显示在背景和其他更新。

+0

哎做了我对你的回答工作? – 2013-02-13 20:12:59

+0

你好?不要告诉我你的那些人问问题,然后不upvote或选择答案.. – 2013-02-13 21:51:58

+0

我编辑了我的问题 - 请参阅部分:更新。 – user1800825 2013-02-14 19:11:36

回答

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

+0

这并不能解决他的问题。 – dymmeh 2013-02-13 19:45:36

+0

我的答案是一半正确的。但感谢你成为有用的dophyl。 – 2013-02-13 19:46:14

+0

已更新的答案。 – 2013-02-13 19:50:10