【问题标题】:Select first item from ListView inside of a NavigationDrawer in onCreate?从 onCreate 中的 NavigationDrawer 内的 ListView 中选择第一项?
【发布时间】:2014-11-30 01:31:43
【问题描述】:

我正在编写一个支票簿 Android 应用程序,该应用程序在导航抽屉内显示银行账户列表。应用程序的主屏幕显示基本帐户信息(姓名、余额等)。

我能够实现 onClick 方法,以便在选择帐户时更新主屏幕,但我希望通过在应用程序打开时选择 ListView 中的第一项的方式来实现。

换句话说,当我启动应用程序时,我应该看到检查帐户信息,但我现在看到的都是默认 0,因为在启动时没有将 Intent 传递给 Activity。我尝试以编程方式选择主要活动的 onCreate 方法中的第一项,但这不起作用。

编辑

这是我的主要活动的 onCreate 代码:

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

    final View rootView = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);

    mDrawerListView = (ListView) rootView.findViewById(R.id.listview_account);

    // Get the Cursor that will be used to load accounts
    Cursor accounts = dataSource.getAccounts();

    // Make adapter.
    mAccountAdapter = new AccountAdapter(getActivity(), accounts, 0);

    mDrawerListView.setAdapter(mAccountAdapter);
    mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l){
            HeaderViewListAdapter headerViewAdapter = (HeaderViewListAdapter) adapterView.getAdapter();
            AccountAdapter adapter = (AccountAdapter) headerViewAdapter.getWrappedAdapter();
            Cursor cursor = adapter.getCursor();
            if(cursor != null && cursor.moveToPosition(i)){
                // Adjust main page
            }
        }
    });

    return rootView;
}

在调用setUp 方法后,我尝试以编程方式选择第一项,但这不起作用。这应该在主要活动中处理还是在片段中处理?

【问题讨论】:

  • 请发布您的代码!
  • 请发布您的 NavigationFragment(或类似的)代码。
  • 你在 Main Activity 上实现了onNavigationDrawerItemSelected(int position) 方法吗?如果是,您能否在运行应用程序后检查它是否被调用?
  • @Harry 我相信代码在那里,但我没有改变它。早上我会附上调试器,让你知道。
  • 你试过在MainActivity的onCreate末尾添加setItem(0)吗?

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


【解决方案1】:

您看过example 导航抽屉吗?附带说明一下,在 Android Studio 中创建新项目时,您可以使用的模板之一是基于 Navigation Drawer 的应用程序。我建议您看一下并熟悉它的工作原理。

无论如何,我假设您正在使用该示例,其中您有一个 MainActivity,并且当您在 NavigationDrawer 中选择项目时,您实际上是在替换 MainActivity 容器中的片段。例如,你可以做这样的事情(有点伪代码):

private ListView mNavigationList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // init your listview, etc.
    mNavigationList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            onNavigationItemSelected(position);
        }
    });

    // show the "first" fragment
    onNavigationItemSelected(0);
}

private void onNavigationItemSelected(int position) {
    FragmentManager manager = getFragmentManager();
    Fragment f;
    String tag;

    switch (position) {
    case 0:
        tag = YourFragment.TAG;
        f = manager.findFragmentByTag(tag);
        if (f == null) {
            f = YourFragment.newInstance();
        }
    // ...
    }

    FragmentTransaction t = manager.beginTransaction();
    t.replace(R.id.container, f, tag);
    t.addToBackStack(tag);
    t.commit();
}

您的主要活动布局可能包括 FrameLayout 和 DrawerLayout。当您从 Drawer 的 ListView 中选择项目时,会触发 onNavigationItemSelected 并将 FrameLayout 容器替换为您选择的 Fragment。根据您的问题,当应用加载时,容器将替换为“第一个”片段。

【讨论】:

  • 抱歉这么晚才回来。我以前设计的不同,所以我不得不花一些时间重新设计它以包含这样的东西,但它就像一个魅力。
  • 另外,非常感谢您的详细解释,甚至资源。我使用的是示例导航抽屉,但处理 onNavigationItemSelected 的方式非常不同。我在抽屉内的列表视图中使用了 onClickListener,但是切换到这个比我做的更好,而且动作更快。
  • 没问题,很高兴能帮上忙。
【解决方案2】:
public class HomeActivity extends FragmentActivity {

FragmentContainerHandler fragObj = new FragmentContainerHandler(
        getSupportFragmentManager());

private DrawerLayout mdrawerlayout;
private ListView mListview;
private ImageView mActionbarButton;
private ViewPager mPager;
private PagerAdapter mPagerAdapter;
private ActionBarDrawerToggle mActionbartogle;
private TextView mtimertextview, headerTV;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    mListview = (ListView) findViewById(R.id.left_drawer);

    //set here array adapter
    mAccountAdapter = new AccountAdapter(getActivity(), accounts, 0);

    mListview.setAdapter(mAccountAdapter);

    mdrawerlayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    ActionBar obj = getActionBar();

    obj.setCustomView(R.layout.action_bar_custum);
    obj.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

    mActionbarButton = (ImageView) findViewById(R.id.actionbarButton);
    mActionbarButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mdrawerlayout.openDrawer(mListview);
            if (mdrawerlayout.isDrawerOpen(mListview)) {
                mdrawerlayout.closeDrawer(mListview);

            }
        }
    });
    mListview.setOnItemClickListener(new SelectItemFormListView());
    fragObj.replaceFragment(0);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();
    return super.onOptionsItemSelected(item);
}
public class SelectItemFormListView implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        mdrawerlayout.closeDrawer(mListview);

        if (position == 5) {

            startActivity(new Intent(HomeActivity.this, MainAcivity.class));

            finish();
        } else {
            fragObj.replaceFragment(position);
        }
    }
}

}

public class FragmentContainerHandler {
FragmentManager fragmntMgr;

public FragmentContainerHandler(FragmentManager fragmntMgr) {
    this.fragmntMgr = fragmntMgr;
}

public void replaceFragment(int position) {
    Fragment fragment = null;
    if (position == 0) {
        fragment = new FindPeoples(this);
    }
    if (position == 4) {
        fragment = new ProfileView();
    }
    if (position == 5) {
        fragment = new Notification();
    }
    if (position == 6) {
        fragment = new Private_Message();
    }

    android.support.v4.app.FragmentTransaction ft = fragmntMgr
            .beginTransaction();

    // ft.setCustomAnimations(R.anim.rightsidein,0);
    List<Fragment> list = fragmntMgr.getFragments();
    if (list != null) {
        for (Fragment element : list) {

            if (element != null) {
                ft.remove(element);
                fragmntMgr.popBackStack();
            }
        }
    }
    ft.replace(R.id.content_frame, fragment, "fragment");
    ft.commit();
}

}

public class FindPost extends android.support.v4.app.Fragment {
private View rootview;

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

    rootview = inflater.inflate(R.layout.activity_find_post, container,
            false);

    return rootview;
}

}

【讨论】:

    【解决方案3】:

    创建一个类来保存您的项目的数据。在您的项目类中创建一个布尔变量 isSelected。检查适配器getView 中的isSelected。在onCreate 中获取列表视图中的第一项,并在您的第一项上将isSelected 变量设置为true。

    【讨论】:

    • 我仍然不确定我是否理解。如果我设置isSelected为true,我在getView里怎么办?
    • 根据您定义的任何其他变量调整您的主页。您可以(提示,提示)使用我建议的类来保存所有特定于项目的变量,然后使用它们相应地更新您的页面。
    • 我会继续玩这个想法。我开始认为我需要重新设计设计。如果用户在关闭应用程序之前选择了一个帐户怎么办?如果用户没有有任何帐户供我选择怎么办?如果我能解决这样的问题,我会告诉你的。
    • @McAdam331,在初始化项目类时将 isSelected 设置为 false,以避免从应用程序的先前运行中选择。如果您使用序列化或其他方式持久化这些类,请在其上使用transient。如果用户没有帐户,请不要设置任何项目isSelected 变量,并显示启动页面或其他内容。
    【解决方案4】:

    将此属性放在您的列表视图中(在 xml 代码中)

    android:choiceMode="singleChoice"
    

    在你的 oncreate 函数上写下这段代码

    arraylist.get(0).setSelected(true);
    
    arrayAdapter.notifyDataSetChanged();
    

    使用列表视图的泛型类

    public class ListData 
    {
    public String MenuTitle="";
    
    public boolean Selected=false;
    public String getMenuTitle() 
    {
        return MenuTitle;
    }
    public void setMenuTitle(String menuTitle) 
    {
        MenuTitle = menuTitle;
    }
    public boolean isSelected() 
    {
        return Selected;
    }
    public void setSelected(boolean selected) 
    {
        Selected = selected;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 2014-12-12
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多