我想在不同的行上用不同的XML模板填充一个列表视图。我丢失了一个教程,现在我被卡住了。我得到了所有行的相同模板。所以我做的是,我创建了一个Adapter和一个Wrapper:
ListViewAdapter:
import java.util.List;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
public class ListViewAdapter extends ArrayAdapter<ListItem> {
private Activity activity = null;
private List<ListItem> items = null;
private int templateId = 0;
public static final int TPL_TITLE = 1;
public static final int TPL_PAYMENT = 2;
public static final int TPL_NOTE = 3;
public int getTemplateId() {
return templateId;
}
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
public List<ListItem> getItems() {
return items;
}
public void setItems(List<ListItem> items) {
this.items = items;
}
public ListViewAdapter(Activity activity, List<ListItem> items,
int templateId) {
super(activity, android.R.layout.simple_list_item_1, items);
this.items = items;
this.activity = activity;
this.templateId = templateId;
}
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ListViewWrapper wrapper = null;
if (row == null) {
LayoutInflater inflater = activity.getLayoutInflater();
row = inflater.inflate(R.layout.listviewtemplates, null);
wrapper = new ListViewWrapper(row);
row.setTag(wrapper);
} else {
wrapper = (ListViewWrapper) row.getTag();
}
wrapper.setTemplateId(templateId);
wrapper.populateFrom(items.get(position));
return (row);
}
}
ListViewWrapper:
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableRow;
import android.widget.TextView;
public class ListViewWrapper {
private TextView title = null; //txt
private TextView description = null; //subtext
private TextView amount = null;
private TextView date = null;
private ImageView vink = null;
private ImageView label = null; //icon
private TableRow listitem = null;
private View row = null;
private int templateId = 0;
//Set the right template view to be visible
private void setTemplate() {
row.findViewById(R.id.templatetitle).setVisibility(View.GONE);
row.findViewById(R.id.templatepayment).setVisibility(View.GONE);
row.findViewById(R.id.templatenote).setVisibility(View.GONE);
switch (templateId) {
case ListViewAdapter.TPL_TITLE:
row.findViewById(R.id.templatetitle).setVisibility(View.VISIBLE);
break;
case ListViewAdapter.TPL_PAYMENT:
row.findViewById(R.id.templatepayment).setVisibility(View.VISIBLE);
break;
case ListViewAdapter.TPL_NOTE:
row.findViewById(R.id.templatenote).setVisibility(View.VISIBLE);
break;
}
}
public ListViewWrapper(View row) {
this.row = row;
}
//Fill the template with the right values
public void populateFrom(ListItem r) {
getText().setText(r.getTitle());
if (templateId == ListViewAdapter.TPL_TITLE) {
//Do Nothing... Title is enough
// getIcon().setImageResource(
// ImageUtilities.getDrawableById(r.getType()));
}
if (templateId == ListViewAdapter.TPL_PAYMENT) {
//SUBTXT, AMOUNT, DATE
getSubtext().setText(r.getDescription());
getAmount().setText(r.getAmount());
getDate().setText(r.getDate());
}
if (templateId == ListViewAdapter.TPL_NOTE) {
getLabel().setImageResource(r.getLabel());
getBackground().setBackgroundResource(r.getBackground());
if (r.getVinkOn()==1){getVink().setImageResource(R.drawable.vink_on);}else{getVink().setImageResource(R.drawable.vink_off);}
}
setTemplate();
}
public int getTemplateId() {
return templateId;
}
public void setTemplateId(int templateId) {
this.templateId = templateId;
switch (templateId) {
case ListViewAdapter.TPL_TITLE:
break;
case ListViewAdapter.TPL_PAYMENT:
break;
case ListViewAdapter.TPL_NOTE:
break;
}
}
//SET MAIN TITLE ID
TextView getText() {
if (title == null) {
switch (templateId) {
case ListViewAdapter.TPL_TITLE:
title = (TextView) row.findViewById(R.id.titletitle);
break;
case ListViewAdapter.TPL_PAYMENT:
title = (TextView) row.findViewById(R.id.titlepayment);
break;
case ListViewAdapter.TPL_NOTE:
title = (TextView) row.findViewById(R.id.notetxt);
break;
}
}
return (title);
}
//Alternative text (all except template 2)
TextView getSubtext() {
if (description == null) {
switch (templateId) {
case ListViewAdapter.TPL_PAYMENT:
description = (TextView) row.findViewById(R.id.descriptionpayment);
break;
}
}
return (description);
}
TextView getAmount() {
if (amount == null) {
switch (templateId) {
case ListViewAdapter.TPL_PAYMENT:
amount = (TextView) row.findViewById(R.id.groupamount);
break;
}
}
return (amount);
}
TextView getDate() {
if (date == null) {
switch (templateId) {
case ListViewAdapter.TPL_PAYMENT:
date = (TextView) row.findViewById(R.id.date_payment);
break;
}
}
return (date);
}
ImageView getLabel() {
if (label == null) {
switch (templateId) {
case ListViewAdapter.TPL_PAYMENT:
label = (ImageView) row.findViewById(R.id.labelpayment);
break;
case ListViewAdapter.TPL_NOTE:
label = (ImageView) row.findViewById(R.id.label_note);
break;
}
}
return (label);
}
ImageView getVink() {
if (vink == null) {
switch (templateId) {
case ListViewAdapter.TPL_NOTE:
vink = (ImageView) row.findViewById(R.id.vink);
break;
}
}
return (vink);
}
LinearLayout getBackground(){
if (listitem == null) {
switch (templateId) {
case ListViewAdapter.TPL_PAYMENT:
listitem = (TableRow) row.findViewById(R.id.templatepayment);
break;
case ListViewAdapter.TPL_NOTE:
listitem = (TableRow) row.findViewById(R.id.templatenote);
break;
case ListViewAdapter.TPL_TITLE:
listitem = (TableRow) row.findViewById(R.id.templatetitle);
break;
}
}
return (listitem);
}
}
创建了一个ListItem类(我需要这样做,还是可以使用Note.class和Payment.class?)
public class ListItem {
private long id;
private String title;
private String description;
private String amount;
private String date;
private int label;
private int background;
private int type;
private int vinkon;
public ListItem(long id, String title, String description, String amount, String date, int type, int vinkon){
this.id=id;
this.title = title;
this.description = description;
this.amount=amount;
this.date=date;
this.type = type;
this.label=getLabel();
this.background=getBackground();
this.vinkon=vinkon;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getVinkOn() {
return vinkon;
}
public void setVinkOn(int vinkon) {
this.vinkon = vinkon;
}
public int getLabel() {
label=R.drawable.c_yellow;
if (type==11){label=R.drawable.c_azul;}
if (type==12){label=R.drawable.c_blue;}
if (type==13){label=R.drawable.c_green;}
if (type==14){label=R.drawable.c_orange;}
if (type==15){label=R.drawable.c_purple;}
if (type==16){label=R.drawable.c_red;}
if (type==17){label=R.drawable.c_yellow;}
return label;
}
public void setLabel(int label) {
this.label = label;
}
public int getBackground() {
background=R.drawable.c_yellow_bg;
if (type==11){background=R.drawable.c_azul_bg;}
if (type==12){background=R.drawable.c_blue_bg;}
if (type==13){background=R.drawable.c_green_bg;}
if (type==14){background=R.drawable.c_orange_bg;}
if (type==15){background=R.drawable.c_purple_bg;}
if (type==16){background=R.drawable.c_red_bg;}
if (type==17){background=R.drawable.c_yellow_bg;}
return background;
}
public void setBackground(int background) {
this.background = background;
}
}
在我的活动中,我有以下内容:
public void setList(){
items = new ArrayList();
title=getString(R.string.allpayments);
items.add(new ListItem(id, title, description, amount, date, type, vinkon));
List<Payment> allpayments=paymentdatasource.getAllPayments();
for (int i = 0;i<allpayments.size(); i++) {
Payment listpayment = allpayments.get(i);
id=listpayment.getId();
title=listpayment.getTitle();
description=listpayment.getDescription();
amount=listpayment.getGroupAmount();
date=listpayment.getDate();
items.add(new ListItem(id, title, description, amount, date, type, vinkon));
}
//Set adapter basing on template 1
adapter = new ListViewAdapter(this, items, ListViewAdapter.TPL_PAYMENT);
ListView mainMenu = (ListView) findViewById(R.id.listview);
mainMenu.setAdapter(adapter);
mainMenu.setTextFilterEnabled(true);
}
抱歉,我丢失了教程,现在我不知道如何将不同的行布局放到列表视图中,希望这是可以理解的,有人可以帮助我更进一步。谢谢!
答案 0 :(得分:1)
通过创建BaseAdapter(tutorial)的子类来创建自定义列表适配器。 在列表适配器的getView()方法中,根据您的选择对视图进行膨胀。我用过简单的开关,你可以选择任何逻辑布局。
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
TextView textView;
View rv = null;
if (convertView == null) { // if it's not recycled, initialize some
Display display = getWindowManager().getDefaultDisplay();
rv = convertView;
if (rv == null) {
// Inflate from XML
LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
switch(id)
{
case 1: rv = li.inflate(R.layout.listitemlayout1, null);
break;
case 2: rv = li.inflate(R.layout.listitemlayout2, null);
break;
case 3: rv = li.inflate(R.layout.listitemlayout3, null);
break;
}
}
} else {
rv = convertView;
}
return rv;
}
答案 1 :(得分:0)