我创建了导航抽屉并在列表中显示项目。我的列表是静态的,但我正在显示点数。因此,当用户选择列表中的项目并执行某些活动时,他会获得积分。所以我想尽快更新积分。我怎么能这样做./
以下是我的代码:
活动类:
@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;
}
}
答案 0 :(得分:10)
最后我通过使用下面的代码解决了这个问题。这不是正确的解决方案。但我仍然想回答这个问题,以便其他人可以从中得到参考。 @ user3154663。这可能会帮助您解决问题:
@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);
}
答案 1 :(得分:2)
调用 notifyDatasetChanged()仍然适用于ListView适配器,无论 ListView parent。您必须在抽屉打开和关闭时使用 notifyDatasetChanged()重置适配器,并使用 setadapter 更新列表视图。
答案 2 :(得分:1)
每当您想要更新抽屉布局时,请致电adapter.notifyDataSetChanged();
更新自定义适配器,然后致电mDrawerLayout.invalidate();
确保适配器内的getView()
方法获取最新的分值。
答案 3 :(得分:1)
如果要在用户选择抽屉中的某个项目时更新抽屉项目。 然后
onItemClick
。notifydatasetchange()
以反映更改。但是,如果你想要如果用户在列表中选择了一些项目,那么在选择后关闭抽屉时,你想要更新列表,对于这种情况你
听取抽屉活动的结束 -
public void onDrawerClosed(View view){
//刷新适配器并调用通知数据集更改。
}
这个link解释了抽屉的各种事件
答案 4 :(得分:0)
一种方法是,
在listview
drawer
中显示的getView()
的适配器中,在创建每个视图时,您可以通过将视图传递给更新来注册侦听器。获取点时检查视图是否为空(可能不在屏幕中),如果不是则更新视图。 :)
更新
如果您想在open/close
上刷新列表,可能需要这样的内容
Drawer Listener 其中包含以下回调
onDrawerClosed(View drawerView)
onDrawerOpened(View drawerView)
onDrawerSlide(View drawerView, float slideOffset)
onDrawerStateChanged(int newState)
在这些回调中,您调用call notifyDataSetChanged
来更新listView
答案 5 :(得分:0)
您可以从navigationView对象中调用该项目。
navigationView.getMenu().findItem(R.id.navigation_item_tal).setTitle("elTitulo");