Android - 从另一个 Fragment 类更新 ListView

标签 android listview android-listview android-fragments

在我从当前类的 listView 中删除项目后,我尝试从另一个 fragment 类更新 listView 。例如,我删除了一个有费用的消费者,那么该消费者的费用也会被删除。

但是消费者和费用是不同的页面,使用选项卡控件,这是 fragment ,当我删除消费者时,费用列表不会更新,直到我转到上一个 Activity ,然后再次进入页面。当消费者列表中的消费者被删除后,我该如何更新费用列表?谢谢。

这是消费者/参与者列表的代码:

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);
}

}

最佳答案

使用广播:

在列表 fragment 中创建此类:

public class UpdateReceiver extends BroadcastReceiver {
    public static final String NEW_UPDATE_BROADCAST =
            "your.package.NEW_UPDATE_BROADCAST";
    @Override
    public void onReceive(Context context, Intent intent) {
        //Update the list
    }
}

在 fragment 中声明这一点:

private UpdateReceiver updateReceiver = null;

使用它来注册接收器(当您创建 fragment 时):

IntentFilter filter = new IntentFilter(UpdateReceiver.NEW_UPDATE_BROADCAST);
filter.addCategory(Intent.CATEGORY_DEFAULT);
updateReceiver = new UpdateReceiver();
registerReceiver(updateReceiver, filter);

使用它来取消注册(当您销毁 fragment 时):

if (updateReceiver != null){
    unregisterReceiver(updateReceiver);
    updateReceiver = null;
} 

然后,当您想要请求更新时,您可以像这样发送广播:

Intent broadcastIntent = new Intent();
broadcastIntent.setAction(UpdateReceiver.NEW_UPDATE_BROADCAST);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
sendBroadcast(broadcastIntent);

如果需要,您甚至可以在广播 Intent 中发送数据并在 onReceive 方法中接收数据...

关于Android - 从另一个 Fragment 类更新 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19951839/

相关文章:

android - 水平 ListView

android - 为单个 ListView 设置多个适配器

java - 如何在android中提取IP地址的前三段

android - 适用于 Android 系统的 Google 搜索 API

java - 为所有应用程序 ListView android添加点击功能

java - 使用 BaseAdapter 重新排序和重复 ListView 项目

android - 如何在android中一次对2个列表进行排序

android - iOS/Android 商店并从相应商店之外购买积分(无应用内购买)

android - 如何更改导航 Controller 中目的地的标签属性?

java - 在 Android 中使用另一个 List<String> 追加到全局列表 <String>