Android 使用阵列适配器在ListView中插入分隔符
场景:我有n个选项卡,每个选项卡都有自己的listview。我正在使用阵列适配器生成listview。传递给arrayadaper的数组具有对象数组。每个对象都有和。现在根据菜单类型,如果菜单类型是“menugroup”,我需要使用不同的布局绘制,并将背景设置为红色 问题很简单。。每当我向下/向上滚动时,listview中menugroup行的属性就会传递给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
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;
}
}