繁体   English   中英

多ListViews?

[英]Multi ListViews?

由于很多时间,我一直试图弄清楚该应用程序的制作方法,我是一个新手,所以,对您来说,对我来说容易的事情肯定更难。

说完之后,我将向您说明我的问题:

我想制作一个列出ListView的应用程序,它本身没有任何元素,但是,通过使用“ + ”按钮,您可以它们添加到其中。

行为

单击 +按钮, 插入元素的名称, 然后按 go 。.ListView现在显示具有您为其指定的名称的元素

现在真正的“ 魔术 ”发生了:

假设我突出创建了一个“ Bag ”元素,在这个bag上我也要添加一些对象 ,但是将它们添加到Bag的相同 ListView中并没有用,所以:

单击 ”元素,一个全新的 (空)ListView出现,带有我们特殊的“ + ”按钮,该按钮允许我为袋中的对象创建 元素

只是为了让您理解..我希望该应用程序是动态的,这样,如果您在包中有一个 ,就可以始终在另一个 包中创建一个ListView

如果您没有获得此应用程序的行为,请不要将此问题“搁置”,而是向我提出问题,我将非常乐意回答所有问题!


IMGUR: http ://imgur.com/a/lghZx

首先,不建议将listview放在listview中,因为这会导致滚动问题。建议使用ExpandableListView

预习: 在此处输入图片说明

现在,在本教程中,您将能够使用edittext添加列表项和子列表项,让我们从定义布局开始

1.在activity_main.xml中定义ExpandableListView标签

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="1" >

    <EditText
        android:id="@+id/add_item_et"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <Button
        android:onClick="addItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+" />
</LinearLayout>

<ExpandableListView
    android:id="@+id/parent_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ExpandableListView>

  1. 定义外部列表list_group.xml的布局

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="8dp" android:background="#000000"> <TextView android:id="@+id/lblListHeader" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft" android:textSize="17dp" android:textColor="#f9f93d" /> </LinearLayout> 
  2. 为子级列表创建布局(我们将为子级创建不同的布局)

list_item.xml

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


    <TextView
        android:id="@+id/lblListItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="17dip"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft" />

    </LinearLayout>

list_item_2.xml

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

    <EditText
        android:id="@+id/add_child_list_et"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:ems="10" 
        android:layout_marginLeft="32dp">

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/add_child_list_bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+" />

</LinearLayout>
  1. 在MainActivity.java中定义ExpandableListView

    公共类MainActivity扩展了Activity {

     private ExpandableListView elv; private ExpandableListAdapter adapter; private List<String> listDataHeader;//This is main List private HashMap<String, List<String>> listDataChild;//This is child list private EditText addHeaders; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview_layout); elv = (ExpandableListView) findViewById(R.id.parent_list_view); addHeaders=(EditText) findViewById(R.id.add_item_et); init(); adapter = new ExpandableListAdapter(MainActivity.this,listDataHeader,listDataChild);//This is a custom adapter that we will define shortly elv.setAdapter(adapter); } private void init() { listDataHeader = new ArrayList<String>(); listDataChild=new HashMap<String, List<String>>(); //Just creating one item in our list to start with something listDataHeader.add(new String("Header 1")); List<String> subHeaderOne=new ArrayList<String>(); subHeaderOne.add("");//Create First item always empty as we will have different layout for this subHeaderOne.add("Header1 SubHeading 1"); listDataChild.put(listDataHeader.get(0), subHeaderOne); } public void addItem(View v) { //We will add new item in listDataHeader and also in listDataChild String header=""; header=addHeaders.getText().toString(); if(header.length()>1){ listDataHeader.add(header); List<String> childList=new ArrayList<String>(); childList.add("");//necessary to have atleast one empty item in our child list where we will set different layout listDataChild.put(header, childList); } addHeaders.setText(""); adapter.notifyDataSetChanged(); } } 
  2. 现在,Dirty部分定义了我们自己的自定义适配器ExpandableListAdapter.java

     public class ExpandableListAdapter extends BaseExpandableListAdapter{ private List<String> listDataHeader; private HashMap<String, List<String>> listDataChild; private Context context; public ExpandableListAdapter(Context context, List<String> listDataHeader, HashMap<String, List<String>> listDataChild) { this.listDataHeader=listDataHeader; this.listDataChild=listDataChild; this.context=context; } @Override public int getGroupCount() { return listDataHeader.size(); } @Override public int getChildrenCount(int groupPosition) { return listDataChild.get(listDataHeader.get(groupPosition)).size(); } @Override public Object getGroup(int groupPosition) { return listDataHeader.get(groupPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { final String headerText=(String) getGroup(groupPosition); if(convertView==null){ LayoutInflater inflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView=inflater.inflate(R.layout.list_group, null); } TextView txtListHeader=(TextView) convertView.findViewById(R.id.lblListHeader); txtListHeader.setTypeface(null,Typeface.BOLD); txtListHeader.setText(headerText); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } @Override public View getChildView(final int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final String childText=(String) getChild(groupPosition, childPosition); if(convertView!=null)convertView=null;// If we remove this line then there was problem , Haven't figured it out , its temp solution if(convertView==null){ LayoutInflater inflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); switch(childPosition){ case 0: //If child item is the first item in sub list ,we will set layout which contain EditText and button so to add more item in sub list(child list) convertView=inflater.inflate(R.layout.list_item_2, null); convertView.setId(0); break; default: //If child item is any other than first item in sub list ,we will set layout which contain just TextView convertView=inflater.inflate(R.layout.list_item, null); convertView.setId(1); } } int viewId=convertView.getId(); switch(viewId){ case 0: final EditText editText=(EditText) convertView.findViewById(R.id.add_child_list_et); Button addButton=(Button) convertView.findViewById(R.id.add_child_list_bt); addButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String txt=""; txt=editText.getText().toString(); List<String> newList=listDataChild.get(listDataHeader.get(groupPosition)); newList.add(txt); editText.setText(""); notifyDataSetChanged(); } }); break; case 1: TextView txtListChild=(TextView) convertView.findViewById(R.id.lblListItem); txtListChild.setText(childText+" "+childPosition); break; } return convertView; } @Override public Object getChild(int groupPosition, int childPosition) { return (listDataChild.get(listDataHeader.get(groupPosition))).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } } 

随便问什么

您只需要在屏幕上创建一个EditText视图即可,人们可以在其中使用Button添加对象。 然后,您只需通过该按钮使onClickListener也更新添加到ListViewAdapter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM