如何在 android 中通过多项选择在子导航视图中开发导航视图?

how to develop navigation view inside sub navigation view with multiple selection in android?

我是 Android 的新人。我正在 android 中开发一款应用程序,最低 API 级别为 15,最高 API 级别为 23。
我想要 like this, and another thing is multiple selection item in sub navigation. When any item is selected from parent navigation view, child navigation view will be open, as shown in image. I search on google but not getting answer. I see this 和其他这么多堆栈溢出答案但没有得到。如果有人帮忙,请提前 appreciate.Thanks。

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
            android:id="@+id/lvList"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/colorPrimary"/>
</LinearLayout>

这是我的java文件

public class HomePageActivity extends AppCompatActivity
{

    ListView lvList;

    ArrayList<String> arrayList;
    NavigationViewAdapter adapter;

    ArrayList<RowObject> selectedItemArray;

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

        lvList = (ListView)findViewById(R.id.lvList);

        setUpListView();

        lvList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        lvList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            for (int i = 0; i < selectedItemArray.size(); i++)
            {
                if (i == position){
                    selectedItemArray.get(position).setSelectedItem(true);
                }else{
                    selectedItemArray.get(i).setSelectedItem(false);
                }
            }
            adapter.notifyDataSetChanged();
        }
    });
    }

    private void setUpListView()
    {
        arrayList = new ArrayList<>();
        selectedItemArray = new ArrayList<>();

        for (int i = 0; i < 20; i++)
        {
            arrayList.add("Item "+(i+1));
            selectedItemArray.add(new RowObject(i, false));
        }
        adapter = new NavigationViewAdapter(HomePageActivity.this, arrayList, selectedItemArray);
        if (adapter != null)
        {
            lvList.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }
    }
}

这是我的适配器

public class NavigationViewAdapter extends BaseAdapter
{
    Activity activity;

    View itemView;
    private LayoutInflater inflater;
    private ViewHolder viewHolder;

    ArrayList<String> arrayList;
    ArrayList<RowObject> selectedItemArray;

    public NavigationViewAdapter(Activity activity, ArrayList<String> arrayList, ArrayList<RowObject> selectedItemArray)
    {
        this.activity = activity;
        this.arrayList = arrayList;
        this.selectedItemArray = selectedItemArray;
        inflater = (LayoutInflater)this.activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public Object getItem(int position) {
        return arrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        try
        {
            itemView = convertView;
            if (convertView == null){
                itemView = inflater.from(parent.getContext()).inflate(R.layout.main_activity_item, parent, false);
                viewHolder = new ViewHolder();

                //if this is first time then inflate view
                viewHolder.itemName = (TextView)itemView.findViewById(R.id.itemName);
                itemView.setTag(viewHolder);
            }else{
                viewHolder = (ViewHolder)itemView.getTag();
            }

            //set Data from ArrayList
            viewHolder.itemName.setText(arrayList.get(position));

            if (selectedItemArray.get(position).isSelectedItem()){
                viewHolder.itemName.setBackgroundColor(activity.getResources().getColor(R.color.colorPrimaryDark));
            }else{
                viewHolder.itemName.setBackgroundColor(activity.getResources().getColor(R.color.colorPrimary));
            }

            notifyDataSetChanged();

            return itemView;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    public class ViewHolder
    {
        TextView itemName;
    }
}

这是我的RowObject.java

public class RowObject
{
    public int position;
    boolean isSelectedItem;

    public RowObject(int position, boolean isSelectedItem) {
        this.position = position;
        this.isSelectedItem = isSelectedItem;
    }
    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }
    public boolean isSelectedItem() {
        return isSelectedItem;
    }

    public void setSelectedItem(boolean isSelectedItem) {
        this.isSelectedItem = isSelectedItem;
    }
}

Android 工作室 > 新建 > Activity > Master/Detail 流程

Google 文档 link

计算器 answer

我认为 android 不提供此类布局,但您可以使用您的逻辑进行修复。我认为您需要更改您的 xml 文件,因为您的列表视图宽度是 match_parent,所以您的整个屏幕都已填满并且您的第二个子菜单不是 display.Please 根据您的要求更改或修复。您的主要 xml 文件。

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical">

        <ListView
            android:id="@+id/lvList"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:background="@color/colorPrimary"/>

        <ScrollView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/lvList"
            android:layout_toEndOf="@+id/lvList">

            <LinearLayout
                android:id="@+id/llItemContainer"
                android:layout_width="200dp"
                android:layout_height="50dp"
                android:orientation="vertical"
                android:background="@color/input_login_hint">

            </LinearLayout>

        </ScrollView>

    </RelativeLayout>

</LinearLayout>

并在您的列表视图中添加一个方法 onItemClickListener()。请看我的代码。
java 文件.

public class NavigationActivity extends AppCompatActivity
{
    ListView lvList;
    LinearLayout llItemContainer;

    ArrayList<String> arrayList;
    NavigationViewAdapter adapter;

    ArrayList<RowObject> selectedItemArray;
    ArrayList<String> selectedSecondItem;

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

        lvList = (ListView)findViewById(R.id.lvList);

        setUpListView();

        lvList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        llItemContainer = (LinearLayout)findViewById(R.id.llItemContainer);
        lvList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                for (int i = 0; i < selectedItemArray.size(); i++)
                {
                    if (i == position){
                        selectedItemArray.get(position).setSelectedItem(true);
                    }else{
                        selectedItemArray.get(i).setSelectedItem(false);
                    }
                }
                adapter.notifyDataSetChanged();

                //here you can pass your sub view item array
                generateSubView(position);
            }
        });
    }

    private void setUpListView()
    {
        arrayList = new ArrayList<>();
        selectedItemArray = new ArrayList<>();

        for (int i = 0; i < 20; i++)
        {
            arrayList.add("Item "+(i+1));
            selectedItemArray.add(new RowObject(i, false));
        }
        adapter = new NavigationViewAdapter(NavigationActivity.this, arrayList, selectedItemArray);
        if (adapter != null)
        {
            lvList.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }
    }

    private void generateSubView(int position)
    {
        try
        {
            selectedSecondItem = new ArrayList<>();
            llItemContainer.removeAllViews();

            for (int i = 0; i <= position; i++)
            {
                final TextView rowText = new TextView(NavigationActivity.this);
                TableRow.LayoutParams paramsExample = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT,
                        147,2.0f);
                rowText.setId(i);
                rowText.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
                rowText.setGravity(Gravity.CENTER_VERTICAL);
                rowText.setTextColor(getResources().getColor(android.R.color.white));
                paramsExample.setMargins(3, 3, 3, 3);
                rowText.setPadding(25, 25, 25, 25);
                rowText.setTextSize(18);
                rowText.setText("SecondItem " + i);
                rowText.setLayoutParams(paramsExample);

                rowText.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        rowText.setBackgroundColor(getResources().getColor(R.color.colorAccent));

                        selectedSecondItem.add(rowText.getText().toString());
                    }
                });

                llItemContainer.addView(rowText);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

您从 selectedSecondItem arraylist 中的子导航视图中获取所选项目。