Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用阵列适配器在ListView中插入分隔符_Android_Android Layout_Android Listview_Android Arrayadapter - Fatal编程技术网

Android 使用阵列适配器在ListView中插入分隔符

Android 使用阵列适配器在ListView中插入分隔符,android,android-layout,android-listview,android-arrayadapter,Android,Android Layout,Android Listview,Android Arrayadapter,场景:我有n个选项卡,每个选项卡都有自己的listview。我正在使用阵列适配器生成listview。传递给arrayadaper的数组具有对象数组。每个对象都有和。现在根据菜单类型,如果菜单类型是“menugroup”,我需要使用不同的布局绘制,并将背景设置为红色 问题很简单。。每当我向下/向上滚动时,listview中menugroup行的属性就会传递给listview中的其他行。换句话说,滚动会干扰分隔符 下面是适配器的代码。你能告诉我需要改正的地方吗?提前谢谢 public class

场景:我有n个选项卡,每个选项卡都有自己的listview。我正在使用阵列适配器生成listview。传递给arrayadaper的数组具有对象数组。每个对象都有和。现在根据菜单类型,如果菜单类型是“menugroup”,我需要使用不同的布局绘制,并将背景设置为红色

问题很简单。。每当我向下/向上滚动时,listview中menugroup行的属性就会传递给listview中的其他行。换句话说,滚动会干扰分隔符

下面是适配器的代码。你能告诉我需要改正的地方吗?提前谢谢

public class MyCustomAdapter  extends ArrayAdapter<Menu> {
private ArrayList<Menu> menuItemList; 
Context context;
LayoutInflater vi;

    public MyCustomAdapter(Context context ,ArrayList<Menu> menu) {    
        super(context, 0, menu );    
        this.menuItemList = new ArrayList<Menu>();    
        this.menuItemList.addAll(menu); 
        this.context =context;
        vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
    }    

    private class ViewHolder {
        TextView menuItem;   
        TextView menuGroup;  
    }
    public View getView(final int position, View convertView, ViewGroup parent) {      
        ViewHolder holder;    
        int type =0;
        String menuType = menuItemList.get(position).getMenuType();
        if (menuType.equals("menugroup"))
            type=1;
        if (menuType.equals("menuitem"))
            type=2;

        if (convertView == null) { 
            holder = new ViewHolder();  
            switch (type) {
                case 1:
                convertView = vi.inflate(R.layout.group,  null); 
                holder.menuItem = (TextView) convertView.findViewById(R.id.tvGroup);
                convertView.setBackgroundColor(Color.RED); 
                break;              

                case 2:
                convertView = vi.inflate(R.layout.item,  null); 
                holder.menuItem = (TextView) convertView.findViewById(R.id.tvItem); 
                break; 
            }  
            convertView.setTag(holder); 
    } else {
        holder = (ViewHolder) convertView.getTag();  
    }    

    switch (type) {
    case 1:         
    holder.menuItem.setText(menuItemList.get(position).getItemName()) ; 
        convertView.setBackgroundColor(Color.RED); 
    break;              
    case 2:
          holder.menuItem.setText(menuItemList.get(position).getItemName()) ;  
    break; 
        }
        return convertView; 
    }
} 
公共类MyCustomAdapter扩展了ArrayAdapter{
私有ArrayList菜单项列表;
语境;
拉平机vi;
公共MyCustomAdapter(上下文,ArrayList菜单){
超级(上下文,0,菜单);
this.menuItemList=new ArrayList();
此.menuItemList.addAll(菜单);
this.context=上下文;
vi=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
}    
私有类视窗持有者{
文本视图菜单项;
文本视图菜单组;
}
公共视图getView(最终int位置、视图转换视图、视图组父级){
视窗座;
int类型=0;
字符串menuType=menuItemList.get(位置).getMenuType();
if(menuType.equals(“menugroup”))
类型=1;
if(menuType.equals(“menuitem”))
类型=2;
如果(convertView==null){
holder=新的ViewHolder();
开关(类型){
案例1:
convertView=vi.充气(R.layout.group,空);
holder.menuItem=(TextView)convertView.findViewById(R.id.tvGroup);
convertView.setBackgroundColor(颜色:红色);
打破
案例2:
convertView=vi.充气(R.布局.项目,空);
holder.menuItem=(TextView)convertView.findViewById(R.id.tvItem);
打破
}  
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}    
开关(类型){
案例1:
holder.menuItem.setText(menuItemList.get(position.getItemName());
convertView.setBackgroundColor(颜色:红色);
打破
案例2:
holder.menuItem.setText(menuItemList.get(position.getItemName());
打破
}
返回视图;
}
} 
现在根据菜单类型,如果菜单类型是“menugroup”,我需要使用不同的布局绘制,并将背景设置为红色

您需要覆盖
getItemViewType()
getViewTypeCount()
以显示多种类型的布局,否则将与适配器的回收器发生冲突


看起来您已经完成了大部分工作,但让我们修改一些代码:

public int getItemViewType(int position) {
    if (menuItemList.get(position).getMenuType().equals("menugroup")) 
        return 0;
    return 1;
}

public int getViewTypeCount() {
    return 2;
}
然后像这样使用
getView()

public View getView(final int position, View convertView, ViewGroup parent) {      
    ViewHolder holder;    
    if (convertView == null) { 
        holder = new ViewHolder();  
        switch (getItemViewType(position)) {
        case 0:
            convertView = vi.inflate(R.layout.group,  null); 
            holder.menuItem = (TextView) convertView.findViewById(R.id.tvGroup);
            convertView.setBackgroundColor(Color.RED); 
            break;              
        case 1:
            convertView = vi.inflate(R.layout.item,  null); 
            holder.menuItem = (TextView) convertView.findViewById(R.id.tvItem); 
            break; 
        }  
        convertView.setTag(holder); 
    } else {
        holder = (ViewHolder) convertView.getTag();  
    }    

    holder.menuItem.setText(menuItemList.get(position).getItemName()); 

    return convertView; 
} 

如何忽略菜单组行上的单击

以非常类似的方式,您需要重写另外两个方法
areAllItemsEnabled()
isEnabled(int)
。由于启用的项目只是上面的特定项目类型,因此代码看起来也完全相同

public boolean areAllItemsEnabled() {
    return false;
}

public boolean isEnabled(int position) {
    return menuItemList.get(position).getMenuType().equals("menugroup"); 
}

您可以通过如下方式绑定自定义xml文件来添加seprotor


在java文件中编写以下代码

@Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.customer_list);

        btnAddCustomer=(Button)findViewById(R.id.btnAddCustomer);
        lst_customer_list=(ListView)findViewById(R.id.listView1);

        list=new ArrayList<String>();

        list.add("Mehul");
        list.add("Sanket");
        list.add("Nitin");
        list.add("Angel");
        list.add("Kirti");
        list.add("Kirit");
        list.add("Gangeshwar");
        list.add("Bhavesh");

        lst_customer_list.setAdapter(new Listadapter(getApplicationContext(), R.id.listView1, list));


    }

    public class Listadapter extends ArrayAdapter<String>
    {   
        ArrayList<String> mList = new ArrayList<String>();

        public Listadapter(Context context, int textViewResourceId,ArrayList<String> list) 
        {
            super(context, textViewResourceId, list);
            this.mList = list;

        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) 
        {

            View v = convertView;

            if(v==null)
            {
                LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v=li.inflate(R.layout.custom_row, null);

            }

            TextView Title = (TextView) v.findViewById(R.id.custom_text);
            final RelativeLayout content = (RelativeLayout) v.findViewById(R.id.main);


            String listitem=mList.get(position);

            Title.setText(listitem);


            content.setOnClickListener(new OnClickListener()
            {

                @Override
                public void onClick(View arg0) 
                {

                }
            });

            return v;
        }


    }
@覆盖
创建时受保护的void(Bundle savedInstanceState)
{
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.customer_列表);
btnAddCustomer=(按钮)findViewById(R.id.btnAddCustomer);
lst_customer_list=(ListView)findViewById(R.id.listView1);
列表=新的ArrayList();
列表。添加(“Mehul”);
列表。添加(“Sanket”);
列表。添加(“镍钛合金”);
列表。添加(“天使”);
列表。添加(“Kirti”);
列表。添加(“Kirit”);
列表。添加(“Gangeshwar”);
列表。添加(“Bhavesh”);
lst_customer_list.setAdapter(新的Listadapter(getApplicationContext(),R.id.listView1,list));
}
公共类Listadapter扩展了ArrayAdapter
{   
ArrayList mList=新的ArrayList();
公共Listadapter(上下文上下文、int textViewResourceId、ArrayList列表)
{
super(上下文、textViewResourceId、列表);
this.mList=列表;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图)
{
视图v=转换视图;
如果(v==null)
{
LayoutInflater li=(LayoutInflater)getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
v=li.充气(R.布局.自定义行,空);
}
TextView Title=(TextView)v.findViewById(R.id.custom_text);
最终RelativeLayout内容=(RelativeLayout)v.findViewById(R.id.main);
字符串listitem=mList.get(位置);
Title.setText(列表项);
setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图arg0)
{
}
});
返回v;
}
}

谢谢你,梅胡尔。。我使用了getItemViewType和getViewTypeCount并解决了它。。谢谢你,还有一个问题。。如何忽略菜单组行上的单击。。有线索吗?
@Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.customer_list);

        btnAddCustomer=(Button)findViewById(R.id.btnAddCustomer);
        lst_customer_list=(ListView)findViewById(R.id.listView1);

        list=new ArrayList<String>();

        list.add("Mehul");
        list.add("Sanket");
        list.add("Nitin");
        list.add("Angel");
        list.add("Kirti");
        list.add("Kirit");
        list.add("Gangeshwar");
        list.add("Bhavesh");

        lst_customer_list.setAdapter(new Listadapter(getApplicationContext(), R.id.listView1, list));


    }

    public class Listadapter extends ArrayAdapter<String>
    {   
        ArrayList<String> mList = new ArrayList<String>();

        public Listadapter(Context context, int textViewResourceId,ArrayList<String> list) 
        {
            super(context, textViewResourceId, list);
            this.mList = list;

        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) 
        {

            View v = convertView;

            if(v==null)
            {
                LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v=li.inflate(R.layout.custom_row, null);

            }

            TextView Title = (TextView) v.findViewById(R.id.custom_text);
            final RelativeLayout content = (RelativeLayout) v.findViewById(R.id.main);


            String listitem=mList.get(position);

            Title.setText(listitem);


            content.setOnClickListener(new OnClickListener()
            {

                @Override
                public void onClick(View arg0) 
                {

                }
            });

            return v;
        }


    }