场景:我有多个标签,每个标签都有自己的列表视图。我正在使用数组适配器生成列表视图。传递给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;
}
}
答案 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;
}
}