【问题标题】:how to develop navigation view inside sub navigation view with multiple selection in android?如何在android中使用多选开发子导航视图内的导航视图?
【发布时间】:2017-06-18 03:03:51
【问题描述】:

我是 Android 新手。我正在用 android 开发一个应用程序,最低 API 级别为 15,最高 API 级别为 23。
我想要like this,另一件事是子导航中的多项选择项。当从父导航视图中选择任何项目时,子导航视图将打开,如图所示。我在谷歌上搜索但没有得到答案。我看到this 和其他很多堆栈溢出答案但没有得到。如果有人帮助,那么非常感谢。在此先感谢。

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;
    }
}

【问题讨论】:

  • 你喜欢这个吗?请看answer
  • 你会尝试什么?
  • Shailesh Limbadiya 我可以生成列表,但我不知道如何添加和显示子导航视图?
  • 请分享您的 xml 和 java 文件。
  • 请分享您的 RowObject 类代码

标签: android android-layout listview submenu


【解决方案1】:

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

ma​​in_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 中的子导航视图中获取所选项目。

【讨论】:

  • 谢谢。它的工作魅力。我在最后五天尝试。你节省了我的时间。
【解决方案2】:

Android Studio > 新建 > 活动 > 主/详细流程

谷歌文档link

或

堆栈溢出answer

【讨论】:

  • 感谢您的回复。这不完全是我想要的,但它就在附近,我会检查一下,如果我实现了,我会尝试。谢谢
猜你喜欢
  • 2017-05-02
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多