我有一个ListView
,它应该成为一个菜单,每行有两个drawable和两个text视图。
活动代码:
ArrayList<MenuItem> itemArray = new ArrayList<MenuItem>();
itemArray.add(new MenuItem("Headertexxt", "subbtexdt"));
itemArray.add(new MenuItem("asf", "asf"));
ListView listView = (ListView) findViewById(R.id.listViewCM);
String[] array = getResources().getStringArray(R.array.buttonsCM);
int[] images = new int[] { R.drawable.btn_car, R.drawable.btn_star, R.drawable.btn_bag};
listView.setAdapter(new HomeScreenButtonsAdapterSubtext(this, R.layout.row,
itemArray, images, R.drawable.list_arrow));
Utils.setListViewHeightBasedOnChildren(listView);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
findViewById(R.id.buttonCreditCompilation).performClick();
break;
case 1:
findViewById(R.id.buttonYourCredits).performClick();
break;
}
}
});
适配器代码:
public class HomeScreenButtonsAdapterSubtext extends ArrayAdapter<MenuItem> {
private Drawable[] drawables;
private Drawable arrowDrawable;
private ArrayList<MenuItem> items;
public HomeScreenButtonsAdapterSubtext(Context context, int resourceId,
ArrayList<MenuItem> items, int[] images, int arrowImage) {
super(context, resourceId, items);
this.items = items;
Resources resources = context.getResources();
if (images != null) {
drawables = new Drawable[images.length];
int i = 0;
for (int id : images) {
Drawable drawable = resources.getDrawable(id);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
drawables[i++] = drawable;
}
}
arrowDrawable = resources.getDrawable(arrowImage);
arrowDrawable.setBounds(0, 0, arrowDrawable.getIntrinsicWidth(),
arrowDrawable.getIntrinsicHeight());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
if (v instanceof TextView) {
Drawable dr = drawables != null ? drawables[position %
drawables.length] : null;
((TextView) v).setCompoundDrawables(dr, null, arrowDrawable, null);
Utils.setFont((TextView) v);
}
// View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
MenuItem station = items.get(position);
if (station != null) {
TextView tt = (TextView) v.findViewById(R.id.headerText);
TextView bt = (TextView) v.findViewById(R.id.subText);
if (tt != null) {
tt.setText(station.getHeaderText());
}
if (bt != null) {
bt.setText(station.getSubText());
}
}
return v;
}
我现在遇到的问题是我无法根据孩子设置listview height
。我在这里尝试这样做:Utils.setListViewHeightBasedOnChildren(listView);
但在此行收到错误:arrayadapter requires the resource id to be a textview
。有谁知道这方面的解决方案?
我可以使用其他方法设置ListView
身高吗?
由于
答案 0 :(得分:1)
实际上根据其内容设置ListView
的高度并没有多大意义。
因为ListView
的整个要点是使其内容可滚动(无论多大)......所以应该有一个固定的高度。
答案 1 :(得分:1)
但是得到错误:arrayadapter要求资源ID为a 这一行的textview。
R.layout.row
是一个布局文件,它不仅仅有TextView
。如果你调用了你使用过的超级构造函数,并且你也调用了适配器中的super.getView
(在getView
方法中)方法,那么ArrayAdapter
会抱怨,因为它需要一个小部件。传递给它的布局文件(单个TextView
)。
当您确切知道该行不能成为{{1的实例时,我不明白为什么您在getView
方法(使用超级调用)中拥有该段代码的原因}。
我不确定是否设置Textview
的高度,如果您尝试显示ListView
的所有行,请不要这样做(因为你使ListView
基本没用)。如果您仍想这样做,那么最好丢失ListView
并手动构建行布局。