【问题标题】:How to refresh list of the navigation drawer as soon as its open/closed in Android如何在Android中打开/关闭后立即刷新导航抽屉列表
【发布时间】:2014-06-01 17:22:20
【问题描述】:

我已经创建了导航抽屉并在列表中显示项目。我的列表是静态的,但我正在显示点。因此,当用户选择列表中的项目并进行一些活动时,他会获得积分。所以我想在他得到后立即更新积分。我该怎么做。/

下面是我的代码:

活动类:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home_page);
    // Initializing
    dataList = new ArrayList<DrawerItem>();
    mTitle = mDrawerTitle = getTitle();
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
            GravityCompat.START);

    sharedPreferences = getSharedPreferences(Constant.LOGIN_CHECK,
            Constant.PRIVATE_MODE);
    editSharedPreferences = sharedPreferences.edit();
    if (sharedPreferences.getBoolean(Constant.IS_ALREADY_LOGIN,
            false)) {
        loginInBackground();
    }
    String p1 = sharedPreferences.getString(Constant.USERS_POINTS,
            "");
    String p2 = sharedPreferences.getString(
            Constant.LEVEL_ONE_POINTS, "");
    String p3 = sharedPreferences.getString(
            Constant.LEVEL_TWO_POINTS, "");

    String pointText = " POINTS";
    dataList.add(new DrawerItem("OVERVIEW", R.drawable.ic_action_eye,
            Color.DKGRAY, Color.TRANSPARENT));
    dataList.add(new DrawerItem("EARN POINTS", R.drawable.ic_action_dollor,
            Color.GREEN, Color.TRANSPARENT));
    dataList.add(new DrawerItem("MY POINTS ", p1 + pointText, Color.BLACK,
            Color.BLACK));
    dataList.add(new DrawerItem("REFERRALS POINTS LV1 ", p2 + pointText,
            Color.BLACK, Color.BLACK));
    dataList.add(new DrawerItem("REFERRALS POINTS LV2 ", p3 + pointText,
            Color.BLACK, Color.BLACK));
    dataList.add(new DrawerItem("WITHDRAW REWARDS",
            R.drawable.ic_action_home, Color.DKGRAY, Color.TRANSPARENT));
    dataList.add(new DrawerItem("MY PROFILE", R.drawable.ic_action_settings,
            Color.DKGRAY, Color.TRANSPARENT));
    dataList.add(new DrawerItem("HELP", R.drawable.help_d, Color.DKGRAY,
            Color.TRANSPARENT));

    adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,
            dataList);

    mDrawerList.setAdapter(adapter);

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open,
            R.string.drawer_close) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu(); // creates call to
                                        // onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu(); // creates call to
                                        // onPrepareOptionsMenu()
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);

    if (savedInstanceState == null) {
        SelectItem(0);
    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    String pointsLeft = sharedPreferences.getString(
            Constant.POINTS_LEFT, "");
    getMenuInflater().inflate(R.menu.main, menu);
    this.menu = menu;
    MenuItem pointsMenu = menu.findItem(R.id.action_settings);
    pointsMenu.setTitle(pointsLeft + " Points");
    return true;
}

public void SelectItem(int possition) {

    Fragment fragment = null;
    Bundle args = new Bundle();
    switch (possition) {
    case 0:
        fragment = new FragmentWelcome();
        args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition)
                .getItemName());
        args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID,
                dataList.get(possition).getImgResID());
        fragment.setArguments(args);
        FragmentManager frgManager0 = getFragmentManager();
        frgManager0.beginTransaction()
                .replace(R.id.content_frame, fragment).commit();
        break;
    case 1:
        fragment = new FragmentAppList();
        args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition)
                .getItemName());
        args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID,
                dataList.get(possition).getImgResID());
        fragment.setArguments(args);
        FragmentManager frgManager1 = getFragmentManager();
        frgManager1.beginTransaction()
                .replace(R.id.content_frame, fragment).commit();
        break;
    case 5:
        fragment = new FragmentRedeemPoints();
        args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition)
                .getItemName());
        args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID,
                dataList.get(possition).getImgResID());
        fragment.setArguments(args);
        FragmentManager frgManager2 = getFragmentManager();
        frgManager2.beginTransaction()
                .replace(R.id.content_frame, fragment).commit();
        break;
    case 6:
        fragment = new SettingsFragment();
        args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition)
                .getItemName());
        args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID,
                dataList.get(possition).getImgResID());
        fragment.setArguments(args);
        FragmentManager frgManager6 = getFragmentManager();
        frgManager6.beginTransaction()
                .replace(R.id.content_frame, fragment).commit();
        break;
    case 7:
        fragment = new HelpFragment();
        args.putString(FragmentWelcome.ITEM_NAME, dataList.get(possition)
                .getItemName());
        args.putInt(FragmentWelcome.IMAGE_RESOURCE_ID,
                dataList.get(possition).getImgResID());
        fragment.setArguments(args);
        FragmentManager frgManager7 = getFragmentManager();
        frgManager7.beginTransaction()
                .replace(R.id.content_frame, fragment).commit();
        break;

    default:

        break;
    }

    mDrawerList.setItemChecked(possition, true);
    mDrawerLayout.closeDrawer(mDrawerList);

}

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getActionBar().setTitle(mTitle);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    mDrawerToggle.onConfigurationChanged(newConfig);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    return false;
}

private class DrawerItemClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        SelectItem(position);

    }
}

CustomDrawerAdapter:

public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem> {

Context context;
List<DrawerItem> drawerItemList;
int layoutResID;

public CustomDrawerAdapter(Context context, int layoutResourceID,
        List<DrawerItem> listItems) {
    super(context, layoutResourceID, listItems);
    this.context = context;
    this.drawerItemList = listItems;
    this.layoutResID = layoutResourceID;

}

@SuppressWarnings("static-access")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    DrawerItemHolder drawerHolder;
    View view = convertView;

    if (view == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        drawerHolder = new DrawerItemHolder();

        view = inflater.inflate(layoutResID, parent, false);
        drawerHolder.ItemName = (TextView) view
                .findViewById(R.id.drawer_itemName);
        drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon);
        drawerHolder.pointsText = (TextView) view
                .findViewById(R.id.get_login);
        drawerHolder.divider = view.findViewById(R.id.dividerView);
        drawerHolder.itemLayoutColor = (LinearLayout) view
                .findViewById(R.id.itemLayoutColor);
        view.setTag(drawerHolder);

    } else {
        drawerHolder = (DrawerItemHolder) view.getTag();

    }

    DrawerItem dItem = (DrawerItem) this.drawerItemList.get(position);
    if (dItem.getPointText() == null) {
        drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(
                dItem.getImgResID()));
        drawerHolder.pointsText.setVisibility(view.GONE);
    } else {
        drawerHolder.pointsText.setText(dItem.getPointText());
        }
    drawerHolder.itemLayoutColor.setBackgroundColor(dItem.layoutColorCode);
    drawerHolder.divider.setBackgroundColor(dItem.colorCode);
    drawerHolder.ItemName.setText(dItem.getItemName());

    return view;
}

private static class DrawerItemHolder {
    TextView ItemName;
    ImageView icon;
    TextView pointsText;
    View divider;
    LinearLayout itemLayoutColor;
}
 }

【问题讨论】:

  • 您想在抽屉式导航列表打开或关闭时立即刷新它??
  • @user3154663 是的,这就是我想要的。

标签: android android-listview navigation-drawer android-navigation


【解决方案1】:

最后我使用下面的代码解决了这个问题。我想回答这个问题,以便其他人可以从中获得参考。 @用户3154663。可能这会帮助您解决问题:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    if (drawerOpen) {
        dataList.remove(2);
        p1 = sharedPreferences.getString(Constant.USERS_POINTS, "");
        p2 = sharedPreferences.getString(Constant.LEVEL_ONE_POINTS,
                "");
        p3 = sharedPreferences.getString(Constant.LEVEL_TWO_POINTS,
                "");
        String pointText = " POINTS";
        dataList.add(2, new DrawerItem("MY POINTS ", p1 + pointText,
                Color.BLACK, Color.BLACK));
        dataList.remove(3);
        dataList.add(3, new DrawerItem("REFERRALS POINTS LV1 ", p2
                + pointText, Color.BLACK, Color.BLACK));
        dataList.remove(4);
        dataList.add(4, new DrawerItem("REFERRALS POINTS LV2 ", p3
                + pointText, Color.BLACK, Color.BLACK));


        adapter.notifyDataSetChanged();
        mDrawerList.setAdapter(adapter);
    }
    return super.onPrepareOptionsMenu(menu);
}

【讨论】:

  • 这个工作,但它减慢了导航抽屉的切换。当 ND 处于切换中间时,它会产生延迟/暂停
  • 如果你没有那个drawerList但是一个菜单你需要传递给isDrawerOpen(..)主DrawerLayout xml的第二个孩子的id。喜欢 R.id.nav_view
【解决方案2】:

notifyDatasetChanged() 的调用仍然适用于 ListView 适配器,与 ListView 父级无关。您必须在抽屉打开和关闭时使用 notifyDatasetChanged() 重置适配器,并使用 setadapter 更新列表视图。

【讨论】:

  • 请看看我上面的代码,请告诉我我需要把这个放在哪个地方。
  • onDrawerOpen 和 onDrawerClosed
  • 在这段代码中你想让我改变 mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { public void onDrawerClosed(View view ) { getActionBar().setTitle(mTitle);无效选项菜单(); } public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle);无效选项菜单(); } };
  • 仍然停留在同一页面
  • 我是新手,请在上面的代码中说明需要进行哪些更改?
【解决方案3】:

每当您想更新抽屉布局时,通过调用 adapter.notifyDataSetChanged(); 更新自定义适配器,然后调用 mDrawerLayout.invalidate();

确保适配器内的getView() 方法获取最新的点值。

【讨论】:

  • 请查看我更新的代码并告诉我需要更改的内容和位置。
  • 当我打开抽屉菜单时,它来自服务器,其中显示的点也在变化,但抽屉中没有。
【解决方案4】:

如果您想在用户选择抽屉中的某个项目时更新抽屉项目。 那么

  1. 您应该刷新onItemClick 中列表视图的适配器。
  2. 致电notifydatasetchange() 反映更改。

但是,如果你想如果用户选择了列表中的某个项目,那么在选择后关闭抽屉时,你想要更新列表,对于这种情况你

  1. 监听抽屉关闭事件 -

    public void onDrawerClosed(View view) {

    //刷新适配器并调用通知数据集变化。

    }

link 解释了抽屉的各种事件

【讨论】:

    【解决方案5】:

    您可以从您的 navigationView 对象中调用该项目。

        navigationView.getMenu().findItem(R.id.navigation_item_tal).setTitle("elTitulo");
    

    【讨论】:

      【解决方案6】:

      一种方法是,

      drawer 中显示的listview 的适配器中,在getView() 内,在创建每个视图时,您可以通过传递要更新的视图来注册一个侦听器。当您获得积分时,检查视图是否为空(可能不在屏幕中),如果不是则更新视图。 :)

      更新

      如果你想在open/close 上刷新你的列表,你可能需要这样的东西

      Drawer Listener 其中包含以下回调

      onDrawerClosed(View drawerView)
      onDrawerOpened(View drawerView)
      onDrawerSlide(View drawerView, float slideOffset)
      onDrawerStateChanged(int newState)
      

      在这些回调中,您调用 call notifyDataSetChanged 来更新 listView

      【讨论】:

      • 能否给我一个示例,或者如果我将粘贴我的代码将帮助我解决这个问题?
      • 请查看我的最新代码并告诉我需要更改的内容和位置。
      • 您要动态改变布局中的哪个视图?
      • 我不明白你问了什么?
      • 您可以更新列表视图中的行,而不是刷新整个视图。这是最有效的。所以让我知道您需要在每一行中更新的视图
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多