Многоуровневый просмотр списка, открывающий два действия из одного элемента. Android Studio | java

#android #android-listview #navigation-drawer #expandablelistview

#Android #android-listview #навигация-ящик #расширяемый список

Вопрос:

Я новичок, и я создал 3-уровневый многоуровневый список внутри навигационного представления, где есть элементы и элементы группы, и каждый элемент открывает новое действие. Изображение прикреплено ниже. изображение

Проблема в том, что есть элемент группы с именем Tomorrowland, в котором также есть два элемента, но по щелчку победителей Tomorrowland он открывает два действия в стеке. Как и в случае с Tomorrowland, победители должны открыть действие A, но его открывающее действие B, а при обратном нажатии на действие B открывается действие A. Действие B открывается при нажатии на победителей.

Код домашнего действия:

 public class HomeActivity1 extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {


@BindView(R.id.multi_home)
MultiLevelListView multiLevelListView;
@BindView(R.id.drawer_layout)
DrawerLayout drawer;
@BindView(R.id.cvSlider)
CardView cvSlider;
@BindView(R.id.autoSlider)
SliderView autoSlider;
@BindView(R.id.rvClub)
RecyclerView rvClub;
@BindView(R.id.rvProjects)
RecyclerView rvProjects;

Toolbar toolbar;
NavigationView nav_view_home;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    ButterKnife.bind(this);
    setSupportActionBar(toolbar);

    toolbar = findViewById(R.id.appbarToolbar);
    nav_view_home = findViewById(R.id.nav_view_home);
    toolbar.setTitle(R.string.app_name);
    toolbar.setTitleTextColor(getResources().getColor(R.color.white));

    


    confMenu();

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.white));
    toggle.setDrawerSlideAnimationEnabled(true);
    toggle.setDrawerIndicatorEnabled(true);
    toggle.syncState();
    toggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.white));

    nav_view_home.setNavigationItemSelectedListener(this);
    displaySelectedScreen("HOME");

    
}

private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
    private void showItemDescription(Object object, ItemInfo itemInfo) {
        if (((BaseItem) object).getName().contains("Home")) {
            displaySelectedScreen("HOME");

        }
        if (((BaseItem) object).getName().contains("We Believe")) {
            displaySelectedScreen("WE BELIEVE");

        }
        if (((BaseItem) object).getName().contains("Workshop")) {
            displaySelectedScreen("WORKSHOPS");

        }
        if (((BaseItem) object).getName().contains("Events")) {
            displaySelectedScreen("EVENTS");

        }
        if (((BaseItem) object).getName().contains("Projects")) {
            displaySelectedScreen("PROJECTS");

        }
        if (((BaseItem) object).getName().contains("Tomorrowland Winners")) {
            displaySelectedScreen("TOMORROWLAND WINNERS");

        }
        if (((BaseItem) object).getName().contains("Tomorrowland Jr.")) {
            displaySelectedScreen("TOMORROWLAND JR.");

        }
        if (((BaseItem) object).getName().contains("Winners")) {
            displaySelectedScreen("SPELL BE WINNERS");

        }
        if (((BaseItem) object).getName().contains("Video Gallery")) {
            displaySelectedScreen("VIDEO GALLERY");

        }
        if (((BaseItem) object).getName().contains("Blog")) {
            displaySelectedScreen("BLOG");

        }
        if (((BaseItem) object).getName().contains("Club")) {
            displaySelectedScreen("CLUBS");

        }
        if (((BaseItem) object).getName().contains("Feed")) {
            displaySelectedScreen("FEED");

        }
        if (((BaseItem) object).getName().contains("Login")) {
            displaySelectedScreen("LOGIN");

        }
        if (((BaseItem) object).getName().contains("Career")) {
            displaySelectedScreen("CAREER");

        }
        if (((BaseItem) object).getName().contains("Inquiry")) {
            displaySelectedScreen("INQUIRY");

        }

    }

    @Override
    public void onItemClicked(MultiLevelListView parent, View view, Object item, ItemInfo itemInfo) {
        showItemDescription(item, itemInfo);
    }

    @Override
    public void onGroupItemClicked(MultiLevelListView parent, View view, Object item, ItemInfo itemInfo) {
        showItemDescription(item, itemInfo);
    }
};

private void confMenu() {
    // custom ListAdapter
    ListAdapter listAdapter = new ListAdapter();
    multiLevelListView.setAdapter(listAdapter);
    multiLevelListView.setOnItemClickListener(mOnItemClickListener);
    listAdapter.setDataItems(HomeCustomDataProvider.getInitialItems());
}


@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

private void displaySelectedScreen(String itemName) {

    switch (itemName) {
        case "HOME":
            drawer.close();
            break;
        case "WE BELIEVE":
            Intent intent = new Intent(HomeActivity1.this,WeBelieveActivity.class);
            startActivity(intent);
            break;
        case "WORKSHOPS":
            Intent intent1 = new Intent(HomeActivity1.this,WorkshopsActivity.class);
            startActivity(intent1);
            break;
        case "EVENTS":
            Intent intent2 = new Intent(HomeActivity1.this,EventsActivity.class);
            startActivity(intent2);
            break;
        case "PROJECTS":
            Intent intent3 = new Intent(HomeActivity1.this,ProjectsActivity.class);
            startActivity(intent3);
            break;
        case "TOMORROWLAND WINNERS":
            Intent intent4 = new Intent(HomeActivity1.this, TomorrowLandWinnersActivity.class);
            startActivity(intent4);
            break;
        case "TOMORROWLAND JR.":
            Intent intent5 = new Intent(HomeActivity1.this, TomorrowLandJrWinnersActivity.class);
            startActivity(intent5);
            break;
        case "SPELL BE WINNERS":
            Intent intent6 = new Intent(HomeActivity1.this,SpellBeWinnersActivity.class);
            startActivity(intent6);
            break;
        case "VIDEO GALLERY":
            Intent intent7 = new Intent(HomeActivity1.this,VideoGalleryActivity.class);
            startActivity(intent7);
            break;
        case "BLOG":
            Intent intent8 = new Intent(HomeActivity1.this,BlogActivity.class);
            startActivity(intent8);
            break;
        case "CLUBS":
            Intent intent9 = new Intent(HomeActivity1.this,ClubActivity.class);
            startActivity(intent9);
            break;
        case "FEED":
            Intent intent10 = new Intent(HomeActivity1.this,FeedActivity.class);
            startActivity(intent10);
            break;
        case "LOGIN":
            Intent intent11 = new Intent(HomeActivity1.this,LoginActivity.class);
            startActivity(intent11);
            break;
        case "CAREER":
            Intent intent12 = new Intent(HomeActivity1.this,CareerActivity.class);
            startActivity(intent12);
            break;
        case "INQUIRY":
            Intent intent13 = new Intent(HomeActivity1.this,InquiryActivity.class);
            startActivity(intent13);
            break;

    }

    drawer.close();
}

@Override
public boolean onNavigationItemSelected(MenuItem item) {

    //calling the method display selected screen and passing the id of selected menu
    displaySelectedScreen(String.valueOf(item.getItemId()));
    //make this method blank
    return true;
}


private class ListAdapter extends MultiLevelListAdapter {

    @Override
    public List<?> getSubObjects(Object object) {
        return HomeCustomDataProvider.getSubItems((BaseItem) object);
    }

    @Override
    public boolean isExpandable(Object object) {
        return HomeCustomDataProvider.isExpandable((BaseItem) object);
    }

    @SuppressLint("InflateParams")
    @Override
    public View getViewForObject(Object object, View convertView, ItemInfo itemInfo) {
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(HomeActivity1.this).inflate(R.layout.makers_menu_item, null);
            viewHolder.nameView = convertView.findViewById(R.id.dataItemName);
            viewHolder.arrowView = convertView.findViewById(R.id.dataItemArrow);
            viewHolder.levelBeamView = convertView.findViewById(R.id.dataItemLevelBeam);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.nameView.setText(((BaseItem) object).getName());
        if (itemInfo.isExpandable()) {
            viewHolder.arrowView.setVisibility(View.VISIBLE);
            viewHolder.arrowView.setImageResource(itemInfo.isExpanded() ?
                    R.drawable.ic_arrow_up : R.drawable.ic_bottom_arrow);
        } else {
            viewHolder.arrowView.setVisibility(View.GONE);
        }
        viewHolder.levelBeamView.setLevel(itemInfo.getLevel());
        return convertView;
    }

    private class ViewHolder {
        TextView nameView;
        ImageView arrowView;
        LevelBeamView levelBeamView;
    }
}
 

}

Код HomeCustomDataProvoder приведен ниже:

 public class HomeCustomDataProvider {


private static final int MAX_LEVELS = 3;

private static final int LEVEL_1 = 1;
private static final int LEVEL_2 = 2;
private static final int LEVEL_3 = 3;
private static List<BaseItem> mMenu = new ArrayList<>();
Context context;

public static List<BaseItem> getInitialItems() {

    List<BaseItem> rootMenu = new ArrayList<>();

    rootMenu.add(new Item("Home"));
    rootMenu.add(new Item("We Believe"));
    rootMenu.add(new GroupItem("Echo"));
    rootMenu.add(new Item("Video Gallery"));
    rootMenu.add(new Item("Blog"));
    rootMenu.add(new Item("Clubs"));
    rootMenu.add(new Item("Feeds"));
    rootMenu.add(new Item("Login"));
    rootMenu.add(new GroupItem("Connect"));
    return rootMenu;
}

public static List<BaseItem> getSubItems(BaseItem baseItem) {

    List<BaseItem> result = new ArrayList<>();
    int level1 = ((GroupItem) baseItem).getLevel()   1;
    int level2 = ((GroupItem) baseItem).getLevel()   2;
    String menuItem = baseItem.getName();

    GroupItem groupItem = (GroupItem) baseItem;
    if (groupItem.getLevel() >= MAX_LEVELS) {
        return null;
    }

    if (level1 == LEVEL_1) {
        switch (menuItem.toUpperCase()) {
            case "ECHO":
                result = getListEcho();
                break;
            case "CONNECT":
                result = getListConnect();
                break;
        }
    }
    if (level2 == LEVEL_2) {
        switch (menuItem.toUpperCase()) {
            case "TOMORROWLAND":
                result = getListTomorrowland();
                break;
            case "SPELL BE":
                result = getListSpellBe();
                break;
        }
    }

    return resu<
}

public static boolean isExpandable(BaseItem baseItem) {
    return baseItem instanceof GroupItem;
}

private static List<BaseItem> getListEcho() {
    List<BaseItem> list = new ArrayList<>();
    list.add(new Item("Workshops"));
    list.add(new Item("Events"));
    list.add(new Item("Projects"));
    list.add(new GroupItem("Tomorrowland"));
    list.add(new GroupItem("Spell Be"));
    return list;
}

private static List<BaseItem> getListTomorrowland() {
    List<BaseItem> list = new ArrayList<>();
    list.add(new Item("Tomorrowland Winners"));
    list.add(new Item("Tomorrowland Jr."));
    return list;
}

private static List<BaseItem> getListSpellBe() {
    List<BaseItem> list = new ArrayList<>();
    list.add(new Item("Winners"));
    return list;
}

private static List<BaseItem> getListConnect() {
    List<BaseItem> list = new ArrayList<>();
    list.add(new Item("Career"));
    list.add(new Item("Inquiry"));
    return list;
}
 

}

Любая помощь будет оценена. Заранее спасибо.

Ответ №1:

Вместо использования contains вы должны использовать equals для проверки всех условий, в вашем случае TomorrowLand Winners contains Winners а также Winners contains Winners , следовательно, он открывает оба.

  //do this for all conditions
 if (((BaseItem) object).getName().equals("Tomorrowland Winners")) {
      displaySelectedScreen("TOMORROWLAND WINNERS");
 }