使用数组适配器在ListView中插入分隔符

时间:2012-12-24 04:43:36

标签: android android-layout android-listview android-arrayadapter

场景:我有多个标签,每个标签都有自己的列表视图。我正在使用数组适配器生成列表视图。传递给arrayadaper的数组包含对象数组。每个对象都有和。现在根据菜单类型,如果菜单类型是“menugroup”,我需要使用不同的布局绘制并将背景设置为RED颜色。

问题很简单..每当我向下/向上滚动列表视图中的menugroup行的属性就会传递给listview中的其他行。换句话说,滚动会扰乱分离器。

以下是Adapter的代码。你能指导我到需要纠正的地步吗?在此先感谢。

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

2 个答案:

答案 0 :(得分:3)

  

现在根据菜单类型,如果菜单类型是“menugroup”,我需要使用不同的布局绘制并将背景设置为RED颜色。

您需要覆盖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; 
} 

  

如何忽略menuGroups行的点击?

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

public boolean areAllItemsEnabled() {
    return false;
}

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

答案 1 :(得分:0)

您可以通过绑定自定义xml文件来添加分隔符..

<LinearLayout
    android:id="@+id/lnrblog"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >






    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_weight="1.18" >

        <TextView
            android:id="@+id/blog_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="1.20"
            android:gravity="center_vertical"
            android:text="Title"
            android:textColor="#ffffff"
            android:textSize="16sp"
            android:textStyle="bold" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/blog_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="1.20"
            android:gravity="center_vertical"
            android:text="Date"
            android:textColor="#ffffff"
            android:textSize="16sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/lnrdivider"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/blog_desc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="1.20"
            android:gravity="center_vertical"
            android:text="Description"
            android:textColor="#ffffff"
            android:textSize="16sp" />
    </LinearLayout>




    <LinearLayout
        android:id="@+id/linear123"
        android:layout_width="fill_parent"
        android:layout_height="2dp"
        android:background="@drawable/seprater_line" >

    </LinearLayout>
</LinearLayout>

并在你的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;
        }


    }