我有一个 ListView
,它应该成为一个菜单,每行有两个可绘制对象和两个 TextView 。
Activity 代码:
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高度
。我尝试在这里执行此操作:Utils.setListViewHeightBasedOnChildren(listView);
,但收到错误:arrayadapter 要求资源 ID 为该行的 textview
。有谁知道这个问题的解决方案?
我可以使用其他方法来设置 ListView
高度吗?
谢谢
最佳答案
but getting the error: arrayadapter requires the resource id to be a textview at this row.
R.layout.row
是一个布局文件,它不仅仅有一个 TextView
。如果您调用已使用的 super 构造函数,并且还调用了适配器中的 super.getView
(在 getView
方法中)方法,则 ArrayAdapter
会提示,因为它期望传递给它的布局文件中有一个小部件(单个 TextView
)。
当您确切地知道该行不能是 Textview 的实例时,我不明白为什么在
.getView
方法中(使用 super 调用)有这段代码
我也不确定如何设置 ListView
的高度,如果您尝试显示 ListView
的所有行,请不要这样做(因为您使 ListView
基本上无用)。如果您仍然想这样做,那么最好放弃 ListView
并手动构建行布局。
关于java - 使用适配器设置没有 TextView 的 ListView 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14396451/