【问题标题】:How to close navigation drawer when RecyclerView itemsRecyclerView项目时如何关闭导航抽屉
【发布时间】:2020-01-22 12:10:34
【问题描述】:

我在菜单中使用 recyclerView。当我单击 RecyclerView 中的项目时,我希望菜单关闭。目前,当我单击该项目时,菜单不会关闭。我应该怎么做才能关闭菜单?我正在使用导航适配器。我用 NavigationAdapter 添加了 recyclerview 的数据。我在 MainActivity 中显示了菜单。

导航适配器

public class NavigationAdapter extends RecyclerView.Adapter<NavigationAdapter.ViewHolder> {

    Context context;
    ArrayList<NavigationDataModel> arrayList = new ArrayList<>();

    public NavigationAdapter(Context context, ArrayList<NavigationDataModel> arrayList) {
        this.context = context;
        this.arrayList = arrayList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.navigationrecyclerview_adapter11, parent, false);



        return new ViewHolder(view);
    }


    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {

        holder.navIcon.setImageResource(arrayList.get(position).getIcon());
        holder.rootView.setBackgroundColor(arrayList.get(position).getColor());
        holder.navTitle.setText(arrayList.get(position).getTitle());

        holder.navTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = holder.getAdapterPosition();
if(String.valueOf(position).equals("0")){
    AppCompatActivity activity = (AppCompatActivity) v.getContext();
    Fragment myFragment = new HesabimFragment();
    activity.getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, myFragment).addToBackStack(null).commit();
}

                if(String.valueOf(position).equals("1")){
                    AppCompatActivity activity = (AppCompatActivity) v.getContext();
                    Fragment myFragment = new SSSFragment();
                    activity.getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, myFragment).addToBackStack(null).commit();
                }

            }
        });

    }


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



    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView navIcon;
        TextView navTitle;
        RelativeLayout rootView;

        public ViewHolder(View itemView) {
            super(itemView);
            rootView = itemView.findViewById(R.id.rootView);
            navIcon = itemView.findViewById(R.id.navIcon);
            navTitle = itemView.findViewById(R.id.navTitle);

        }
    }

MainActivity

public class Main2Activity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
 RecyclerView navRecyclerView;
    LinearLayoutManager layoutManager;
    ArrayList<NavigationDataModel> arrayList = new ArrayList<>();
    NavigationAdapter adapter;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);    

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();


        navigationView.setNavigationItemSelectedListener(this);

        navRecyclerView = findViewById(R.id.navRecyclerView);
        navRecyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        navRecyclerView.setLayoutManager(layoutManager);

        DividerItemDecoration divider = new DividerItemDecoration(
                navRecyclerView.getContext(),
                DividerItemDecoration.VERTICAL
        );
        divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.diveder_recycler));
        navRecyclerView.addItemDecoration(divider);

        initArray();

        adapter = new NavigationAdapter(this, arrayList);
        navRecyclerView.setAdapter(adapter);}

 private void initArray() {

        NavigationDataModel model = new NavigationDataModel();
        model.setIcon(R.mipmap.avatar);
        model.setTitle("Hesabım");
        arrayList.add(model);

        NavigationDataModel model2 = new NavigationDataModel();
        model2.setIcon(R.mipmap.sss3);
        model2.setTitle("S.S.S");
        arrayList.add(model2);
}

 @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        mDrawerLayout.closeDrawer(GravityCompat.END, false);

        return true;
    }

【问题讨论】:

  • 要么将DrawerLayout 实例传递给NavigationAdapter,要么使用从适配器到活动的回调
  • 你能举个例子作为代码结构吗? @Md.Asaduzzaman

标签: android android-recyclerview drawerlayout


【解决方案1】:

您可以在您的活动 Main2Activity 中创建一个方法:

public void onSideMenuClick() {
          //place your closeDrawer code here
        DrawerLayout mDrawerLayout =(DrawerLayout)findViewById(R.id.drawer_layout);
        mDrawerLayout.closeDrawer(GravityCompat.END, false);
  }

在单击适配器中的菜单项时调用该方法:

((Main2Activity) context).onSideMenuClick();

希望这会有所帮助!

【讨论】:

  • 请点赞并接受它,这样对他人也有帮助
  • 考虑使用回调、广播、rx 而不是将上下文转换为活动
【解决方案2】:

创建界面导航点击

     public interface NavClick {
           public void onNavClick(int position); //position for determining which item is clicked
       }

首先,在 NavigationAdapter 中声明 NavClick 的对象

    NavClick navClick

然后像这样更新你的构造函数

    public NavigationAdapter(Context context, ArrayList<NavigationDataModel> arrayList,NavClick navClickEvent) {
    this.context = context;
    this.arrayList = arrayList;
    this.navClick = navClickEvent;
}

然后在onBindViewHolder中

   holder.navTitle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
         navClick.onNavClick(position)
         }

NavAdapter 对象声明的最后修改是这样的

       adapter = new NavigationAdapter(this, arrayList,new NavClick(){
             @Overide
             public void onNavClick(int position){
               //Now you can add your condition which to call when clicking
                 }
                 } );

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    相关资源
    最近更新 更多