导航抽屉 RecyclerView 项目单击活动

2024-02-25

我创建了一个导航抽屉,里面有一个 RecyclerView。我是从 YouTube 上了解到这一点的。但是,我在为其实现“onNavigationDrawerItemSelected”方法时遇到了麻烦。我想要做的是让用户能够单击列表中的项目,并将它们导航到活动而不是片段。

我是android编程新手,因此我对代码的理解很差。我在网上到处查看了教程,例如下面的链接,但它不起作用。我花了很多时间试图解决这个问题,但我得到的只是应用程序崩溃,不得不重新启动整个过程。如果有人能在这方面帮助我,这对我来说意义重大

如何通过导航抽屉导航到不同的活动 https://stackoverflow.com/questions/23475783/how-to-navigate-to-different-activities-through-the-navigation-drawer

OnItemClickListener 导航抽屉 https://stackoverflow.com/questions/16721834/onitemclicklistener-navigation-drawer

http://blog.evizija.si/android-layout/ http://blog.evizija.si/android-layout/

以下是我为 MainActivity、导航抽屉和导航抽屉适配器编写的代码。

导航抽屉片段:

public class NavigationDrawerFragment extends Fragment {

    private RecyclerView recyclerView;
    public static final String PREF_FILE_NAME = "testpref";
    public static final String KEY_USER_LEARNED_DRAWER = "user_learned_drawer";
    private ActionBarDrawerToggle mDrawerToggle;
    private DrawerLayout mDrawerLayout;
    private NavigationDrawerAdapter adapter;

    /*This is to tell the User that there is a navigation drawer*/
    private boolean mUserLearnedDrawer;
    private boolean mFromSavedInstanceState;
    private View containerView;

    public NavigationDrawerFragment() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
        if (savedInstanceState != null) {
            mFromSavedInstanceState = true;
        }
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        recyclerView = (RecyclerView) layout.findViewById(R.id.navigation_drawer_list);
        adapter = new NavigationDrawerAdapter(getActivity(), getData());
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        return layout;
    }


    //Change the Drawables and Text Here for the NavigationDrawer List Items
    public static List<NavigationDrawerItems> getData() {
        List<NavigationDrawerItems> data = new ArrayList<>();
        int[] icons = {R.drawable.ic_account_circle_black_36dp, R.drawable.ic_home_black_36dp, R.drawable.ic_language_black_36dp, R.drawable.ic_redeem_black_36dp, R.drawable.ic_settings_black_36dp};
        String[] titles = {"Restaurants", "Categories", "Planner", "About Us", "Settings"};
        for (int i = 0; i < titles.length && i < icons.length; i++) {
            NavigationDrawerItems current = new NavigationDrawerItems();
            current.iconId = icons[i];
            current.title = titles[i];
            data.add(current);
        }
        return data;
    }


    public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
        containerView = getActivity().findViewById(fragmentId);
        mDrawerLayout = drawerLayout;
        mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {


            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                if (!mUserLearnedDrawer) {
                    mUserLearnedDrawer = true;
                    saveToPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer + "");
                }
                getActivity().invalidateOptionsMenu();
            }


            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                getActivity().invalidateOptionsMenu();
            }
        };
        if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
            mDrawerLayout.openDrawer(containerView);

        }
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerLayout.post(new Runnable() {
            @Override
            public void run() {
                mDrawerToggle.syncState();
            }
        });
    }


    public static void saveToPreferences(Context context, String preferenceName, String preferenceValue) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(preferenceName, preferenceValue);
        editor.apply();
    }


    public static String readFromPreferences(Context context, String preferenceName, String defaultValue) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE);
        return sharedPreferences.getString(preferenceName, defaultValue);
    }

}

主要活动:

public class MainActivity extends ActionBarActivity {

    private Toolbar toolbar;
    private NavigationDrawerFragment drawerFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_appbar);

        /*======= This three statement below is to add the customized ToolBar including the "private" statement above and the navigation drawer =======*/
        toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        drawerFragment = (NavigationDrawerFragment)
                getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
        drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();


        /*======= The term "navigate" is taken from the menu_main.xml file. Rename them when necessary =======*/
        /*======= The startActivity statement enables the icon to be clicked and brings to another activity =======*/
        if (id == R.id.navigate) {
            startActivity(new Intent(this, SubActivity.class));
        }

        return super.onOptionsItemSelected(item);
    }
}

导航抽屉适配器:

public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> {

    private LayoutInflater inflater;
    List<NavigationDrawerItems> data = Collections.emptyList();

    public NavigationDrawerAdapter(Context context, List<NavigationDrawerItems> data) {
        inflater = LayoutInflater.from(context);
        this.data = data;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.fragment_navigation_drawer_row, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        NavigationDrawerItems current = data.get(position);
        holder.title.setText(current.title);
        holder.icon.setImageResource(current.iconId);
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        ImageView icon;

        public MyViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.navigation_drawer_list_text);
            icon = (ImageView) itemView.findViewById(R.id.navigation_drawer_list_icon);
        }
    }
}

在你的适配器类中尝试一下:

class MyViewHolder extends RecyclerView.ViewHolder {
      TextView title;
      ImageView icon;
      public MyViewHolder(View itemView) {
          super(itemView);
          itemView.setOnClickListener(new View.OnCLickListener() {
               @Override
               public void onClick(View v) {
                  Intent intent = new Intent(context, YourActivity.class);
                  context.startActivity(intent)
               }
          });                           
          itemView.findViewById(R.id.navigation_drawer_list_text);
          icon = (ImageView) itemView.findViewById(R.id.navigation_drawer_list_icon);
      }
}

你必须有一个参考context变量,你可以拥有它,你可以通过适配器类的构造函数中的赋值来获取它。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导航抽屉 RecyclerView 项目单击活动 的相关文章

随机推荐

  • 将数据框中的列乘以向量

    我想要做的是将 data frame 的第 1 列中的所有值乘以向量中的第一个元素 然后将第 2 列中的所有值乘以向量中的第二个元素 依此类推 c1 lt c 1 2 3 c2 lt c 4 5 6 c3 lt c 7 8 9 d1 lt
  • 使用 XMLHTTP 方法时等待页面加载

    在下面的工作代码中 我尝试导航到特定的 YouTube 频道 要将视频名称放入 Excel 中 它可以工作 但部分工作 因为代码只列出了大约 30 个视频 Dim x html As Object ele As Object sKeyWor
  • 当 ASP.net 验证摘要已填写时,如何调用 javascript 函数

    我的页面中有一个validationSummary 我想在validationSummary填充后调用一个javascript函数 我怎样才能做到这一点 我认为我应该在后面的代码中添加一个属性 但我无法弄清楚该属性的键是什么 有什么帮助吗
  • VirtualPathUtility 的 ASP.Net Core 替换

    有替代品吗VirtualPathUtility ToAbsolute在 ASP Net Core 中 似乎不可用 我想转换相对路径 例如将 bob 转换为绝对路径 例如 应用程序 鲍勃 我试图从类库中执行此操作 因此无法访问控制器和视图的常
  • 每个块的最大线程数

    我有以下信息 Maximum number of threads per block 512 Maximum sizes of each dimension of a block 512 x 512 x 64 这是否意味着 2d 线程块中的
  • Git:添加非暂存文件

    我对文件进行了更改 尝试暂存文件后git add 像往常一样 我继续承诺git commit m 然而 终端向我吐出了这样的信息 no changes added to commit use git add and or git commi
  • pandas 中 DataFrame.div 和 DataFrame.divide 的区别

    我试图将 pandas 数据帧的一列元素与另一列的相同行索引元素分开 在尝试寻找库函数来实现此目的时 我遇到了两个函数数据框 div https pandas pydata org pandas docs stable generated
  • 计算数据框中每列的非 NA 值的数量[重复]

    这个问题在这里已经有答案了 我有一个很大的数据集 其中包含很多NAs 和一些非 Na 值 此刻我数着我的非NA每列的值如下所示 attach df 1000 sum is na X1 1000 sum is na X2 1000 sum i
  • 带有用于 NTLM 身份验证的 http 客户端的 Spring Rest 模板

    我们在 IIS 服务器中部署了一个 Web 服务 该服务基于 NTLM 身份验证进行身份验证 当我尝试通过在 httpClient UserNamePasswordCredentials 中传递用户名和密码来访问 Web 服务时 收到警告
  • React应用程序未在azure应用程序服务中启动

    我已将一个简单的反应应用程序部署到 azure 应用程序服务 但它无法启动 如何让应用程序运行index html 将此命令添加到您的 azure 仪表板 gt 配置 gt 启动命令中 pm2 serve home site wwwroot
  • 在 sailsjs 视图中访问会话变量

    我对 sailsjs 和 nodejs 很陌生 我正在尝试创建一个身份验证页面 其中一旦用户通过身份验证 我想设置 req session user user id req session authenticated true 然后我需要在
  • 使用平移和缩放计算正确的光标位置

    我已经在这个问题上折腾了大约一个小时了 我有一个支持平移和缩放的视口 平移是通过存储 X 和 Y 轴的偏移来处理的 缩放只是一个从 0 2 到 14 的浮动值 我的问题是 我需要能够将内容放置在用户在视口中单击的位置 但是当我缩放和平移时
  • 如何在不解压依赖 jar 的情况下运行具有故障安全功能的 TestNG 套件?

    我想使用包含在依赖项 jar 中的 TestNG 套件文件来执行集成测试 The 设置 pom xml 的详细信息将在此处讨论 https stackoverflow com questions 10496846 run junit tes
  • 将元素附加到 d3.js 中的现有元素

    我正在尝试使用 d3 js 创建一个实时条形图来绘制随时间变化的值 我就是这样做的 var dataset 5 10 15 20 25 var w 1800 var h 500 var barPadding 1 setInterval fu
  • 找不到 http://java.sun.com/jsf/facelets 的标记库描述符

    我有一个 JSP 然而它的错误是 绝对uri http java sun com jsf facelets http java sun com jsf facelets无法在 web xml 或与此应用程序一起部署的 jar 文件中解析 我
  • 在搜索文本框中悬停关闭图标上显示指针

    我在我的应用程序中使用输入类型搜索 我要显示cursor pointer当用户鼠标悬停在搜索框中的 x 图标上时 我尝试查找为此的 css 但没有找到与此相关的任何内容
  • 使用 Github Actions 将多项目 ASP.NET Core Web 应用部署到 Azure 应用服务

    我正在设置一个新的 ASP NET Core 版本 3 1 Web 应用程序 我将其托管在 Github 上 并使用 Github Actions 部署到 Azure 应用服务 只要解决方案中有一个项目 主 ASP NET Core 项目
  • Rails 控制器 - 仅当 Rails UJS 方法内部成功时才执行操作(相互依赖的方法)

    接下来的另一个问题 Rails 控制器 仅当内部的两个方法成功时才执行操作 相互依赖的方法 https stackoverflow com questions 37727642 rails controller execute action
  • 有什么好处

    使用 thead 而不是 td 有什么好处 如果有好处的话 The thead tbody and tfootHTML 中的元素用于根据内容将表行分组为逻辑部分 您想要这样做有两个主要原因 允许正文滚动 独立于标题和 或 页脚 为了更容易应
  • 导航抽屉 RecyclerView 项目单击活动

    我创建了一个导航抽屉 里面有一个 RecyclerView 我是从 YouTube 上了解到这一点的 但是 我在为其实现 onNavigationDrawerItemSelected 方法时遇到了麻烦 我想要做的是让用户能够单击列表中的项目