带有自定义适配器的Android ListView -getChildAt()返回null
问题描述:
我有一个带有自定义适配器的ListView,我需要访问此ListView的各行视图。我正在尝试使用getChildAt(),但它返回null。带有自定义适配器的Android ListView -getChildAt()返回null
这里是我的ListView:
myListView = (ListView) findViewById (R.id.listViewLayout);
这是自定义适配器:
public class MyListAdapter extends BaseAdapter {
...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_row_layout, parent, false);
}
...
}
我创建一个列表,并将其设置为ListView:
List <String> myList = new ArrayList<String>();
myList.add("entry 1");
myList.add("entry 2");
myList.add("entry 3");
MyListAdapter myListAdapter = new MyListAdapter(getApplicationContext(), myList);
myListView.setAdapter(myListAdapter);
现在,我想要访问单个行的视图。
View v = myListView.getChildAt(myListView.getFirstVisiblePosition());
这个v是空的,不管是什么。此外,myListView.getChildCount()
始终返回空值。
我错过了什么?我需要在getView()
中添加convertView
到parent
吗?我通过错误的参数inflate
?
我一直在努力解决这个问题。请帮帮我!
编辑:我张贴的MyListAdapter类:
public class MyListAdapter extends BaseAdapter {
private Context context;
private List<String> myList;
public MyListAdapter(Context c, List<String> m) {
context = c;
myList = m;
}
@Override
public int getCount() {
return myList.size();
}
@Override
public Object getItem(int position) {
return myList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_row_layout, parent, false);
}
TextView text = (TextView) convertView.findViewById(R.id.itemText);
text.setText(myList.get(pos));
// Set the onClick Listener on this button
Button rowButton = (Button) convertView.findViewById(R.id.itemButton);
//commenting next two lines makes the list row clickable
rowButton.setFocusableInTouchMode(false);
rowButton.setFocusable(false);
rowButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(context, myList.get(pos), Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(pos);
return convertView;
}
}
答
尝试使用ArrayAdapter类来代替扩展BaseAdapter。使用BaseAdapter,我相信你必须保持对象列表和视图本身。所以像这样的东西
public class MyAdapter extends ArrayAdapter<String>
{
...
}
然后你会创建这样的类。
MyListAdapter myListAdapter = new MyListAdapter(getApplicationContext(), R.layout.list_row_layout, myList);
更新 此外,在构造函数中,你是不是叫你的基类的构造函数。
getChildAt的实现看起来像什么? –
你可以发布你的MyListAdapter类的其余部分吗?具体来说,构造函数,getView的完整体和getCount()的实现? – Chris