2013-11-14 2 views
0

Я пытаюсь обновить listView из другого класса фрагмента после удаления элемента из спискаView из текущего класса. Например, я удаляю потребитель, у которого есть счет, тогда и расход этого потребителя также будет удален. Но потребитель и расход - это другая страница, использующая элемент управления вкладками, который является фрагментом, когда я удаляю пользователя, список расходов не обновляется, пока я не перейду на предыдущую страницу, а затем снова введите страницу. Что я могу сделать, чтобы обновить список расходов, когда пользователь из списка потребителей удален? Я слышал, что использование широковещательного приемника способно это сделать, но как я могу реализовать его в своем коде? Я новичок в андроиде, пожалуйста, руководство me.thanksAndroid - обновить ListView от фрагмента к другому

Вот код для списка потребителя/участника:

public class Participant extends ListFragment implements OnClickListener{ 

Intent intent; 
TextView friendId; 
Button addparticipant; 
String eventId; 
ListView lv; 

public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
    EventController controller = new EventController(getActivity()); 

    HashMap<String, String> queryValues = new HashMap<String, String>(); 
    Intent objIntent = getActivity().getIntent(); 
    eventId = objIntent.getStringExtra("eventId"); 
    queryValues.put("eventId", eventId); 
    ArrayList<HashMap<String, String>> friendList = controller 
      .getAllFriends(queryValues); 
    if (friendList.size() != 0) { 
     lv = getListView(); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       friendId = (TextView) view.findViewById(R.id.friendId); 
       String valFriendId = friendId.getText().toString(); 
       Intent objIndent = new Intent(getActivity(), 
         EventPage.class); 
       objIndent.putExtra("friendId", valFriendId); 
       startActivity(objIndent); 
      } 
     }); 
     lv.setOnItemLongClickListener(new OnItemLongClickListener(){ 

      @Override 
      public boolean onItemLongClick(AdapterView<?> arg0, 
        View arg1, int arg2, long arg3) { 
       // TODO Auto-generated method stub 
       friendId = (TextView) arg1.findViewById(R.id.friendId); 
       registerForContextMenu(getListView()); 
       return false; 
      } 

     }); 
     SimpleAdapter adapter = new SimpleAdapter(getActivity(), 
       friendList, R.layout.view_friend_entry, new String[] { 
         "friendId", "friendName", "friendSpending" }, 
       new int[] { R.id.friendId, R.id.friendName, 
         R.id.friendSpending }); 
     adapter.notifyDataSetChanged(); 
     setListAdapter(adapter); 
    } 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.participant, container, false); 
    addparticipant = (Button) rootView.findViewById(R.id.addpart); 
    addparticipant.setOnClickListener(this); 
    return rootView; 

} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Intent objIntent = new Intent(getActivity(), 
      AddParticipant.class); 
    objIntent.putExtra("eventId", eventId); 
    startActivity(objIntent); 
} 
@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
     ContextMenuInfo menuInfo) { 
    String[] menuItems = getResources().getStringArray(R.array.menu); 
    for (int i = 0; i < menuItems.length; i++) { 
     menu.add(Menu.NONE, i, i, menuItems[i]); 
    } 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    int menuItemIndex = item.getItemId(); 
    EventController controller = new EventController(getActivity()); 
    switch (menuItemIndex) { 
    case 0: 
     String valFriendId = friendId.getText().toString(); 
     Intent objIndent = new Intent(getActivity(), 
       EditParticipant.class); 
     objIndent.putExtra("friendId", valFriendId); 
     startActivity(objIndent); 
     break; 
    case 1: 
     String valFriendId2 = friendId.getText().toString(); 
     controller.deleteFriend(valFriendId2); 
     onResume(); 
    } 

    return true; 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    if (getListView() != null) { 
     updateData(); 
    } 
} 

private void updateData() { 
    EventController controller = new EventController(getActivity()); 
    HashMap<String, String> queryValues = new HashMap<String, String>(); 
    Intent objIntent = getActivity().getIntent(); 
    eventId = objIntent.getStringExtra("eventId"); 
    queryValues.put("eventId", eventId); 
    SimpleAdapter adapter = new SimpleAdapter(getActivity(), 
      controller.getAllFriends(queryValues), 
      R.layout.view_friend_entry, new String[] { "friendId", 
        "friendName", "friendSpending" }, new int[] { 
        R.id.friendId, R.id.friendName, R.id.friendSpending }); 
    setListAdapter(adapter); 
} 

}

Вот код для списка расходов:

public class Expense extends ListFragment implements OnClickListener { 

Button addexp; 
TextView expenseId; 
ListView lv; 
String eventId, friendId; 

public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
    EventController controller = new EventController(getActivity()); 

    HashMap<String, String> queryValues = new HashMap<String, String>(); 
    Intent objIntent = getActivity().getIntent(); 
    eventId = objIntent.getStringExtra("eventId"); 
    queryValues.put("eventId", eventId); 
    ArrayList<HashMap<String, String>> expenseList = controller 
      .getAllExpenses(queryValues); 
    if (expenseList.size() != 0) { 
     lv = getListView(); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       expenseId = (TextView) view.findViewById(R.id.expenseId); 
       String valExpenseId = expenseId.getText().toString(); 
       Intent objIndent = new Intent(getActivity(), 
         EditExpense.class); 
       objIndent.putExtra("expenseId", valExpenseId); 
       startActivity(objIndent); 
      } 
     }); 
     SimpleAdapter adapter = new SimpleAdapter(getActivity(), 
       expenseList, R.layout.view_expense_entry, new String[] { 
         "expenseId", "expenseName","expenseQuantity" }, new int[] { 
         R.id.expenseId, R.id.expenseName, R.id.expenseQuantity }); 
     adapter.notifyDataSetChanged(); 
     setListAdapter(adapter); 
    } 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.expense, container, false); 
    addexp = (Button) rootView.findViewById(R.id.addexp); 
    addexp.setOnClickListener(this); 
    return rootView; 

} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Intent objIntent = new Intent(getActivity(), AddExpense.class); 
    objIntent.putExtra("eventId", eventId); 
    startActivity(objIntent); 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    if (getListView() != null) { 
     updateData(); 
    } 
} 

private void updateData() { 
    EventController controller = new EventController(getActivity()); 
    HashMap<String, String> queryValues = new HashMap<String, String>(); 
    Intent objIntent = getActivity().getIntent(); 
    eventId = objIntent.getStringExtra("eventId"); 
    queryValues.put("eventId", eventId); 
    SimpleAdapter adapter = new SimpleAdapter(getActivity(), 
      controller.getAllExpenses(queryValues), 
      R.layout.view_expense_entry, new String[] { "expenseId", 
        "expenseName", "expenseQuantity" }, new int[] { R.id.expenseId, 
        R.id.expenseName, R.id.expenseQuantity }); 
    setListAdapter(adapter); 
} 

}

ответ

2

Тот же сценарий, если вы использовали FragmentPagerAdapter, попробуйте вот это в FirstFragment

private void updateSecondFragment(){ 

    //Way to get TagName which generated by FragmentPagerAdapter 
    String tagName = "android:switcher:" + R.id.pager + ":" + 1; // Your pager name & tab no of Second Fragment 

    //Get SecondFragment object from FirstFragment 
    SecondFragment f2 = (SecondFragment)getActivity().getSupportFragmentManager().findFragmentByTag(tagName); 

    //Then call your wish method from SecondFragment to update appropriate list 
    f2.updateList(); 
} 

У меня есть эта идея, читая this. Тогда немного отредактируйте!

+0

спасибо !! u are awesome – AndroidWorld12

+0

привет, я сталкиваюсь с проблемой сейчас, когда я пытаюсь обновить фрагмент 3 из фрагмента 2, он возвращает мне nullpointerexception. Зачем? – AndroidWorld12

+0

Это хорошее решение. Я искал часы, которые искали что-то. Это отлично работает! – Birrel

0

Одним из способов может быть создание методов в деятельности, которая содержит два fr а также доступ к методам фрагментов из активности. Вы можете обновить базу данных и перезагрузить список одним и тем же методом.

Например, в деятельности

public void updateFragment2(){ ... } 

В фрагменте 1 следует назвать:

((ActivityClass)getActivity()).updateFragment2(); 

В разделе «Общение с деятельностью» вы можете увидеть объяснение этого примера: http://developer.android.com/guide/components/fragments.html

Смежные вопросы