带有自定义适配器的Android ListView-getChildAt()返回null
我有一个带有自定义适配器的ListView,我需要访问此ListView的各个行的视图。我正试图使用getChildAt()执行此操作,但它返回null 这是我的列表视图:带有自定义适配器的Android ListView-getChildAt()返回null,android,android-widget,android-listview,android-ui,Android,Android Widget,Android Listview,Android Ui,我有一个带有自定义适配器的ListView,我需要访问此ListView的各个行的视图。我正试图使用getChildAt()执行此操作,但它返回null 这是我的列表视图: myListView = (ListView) findViewById (R.id.listViewLayout); List <String> myList = new ArrayList<String>(); myList.add("entry 1"); myList.add("entry 2
myListView = (ListView) findViewById (R.id.listViewLayout);
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);
这是自定义适配器:
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:
myListView = (ListView) findViewById (R.id.listViewLayout);
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);
不管怎样,这个v都是空的。此外,myListView.getChildCount()
始终返回null
我错过了什么?是否需要在getView()
中将convertView
添加到parent
?我是否将错误的参数传递给充气
我费了很大劲才弄明白这一点。请帮帮我
编辑:我正在发布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;
}
}
公共类MyListAdapter扩展BaseAdapter{
私人语境;
私人名单;
公共MyListAdapter(上下文c,列表m){
上下文=c;
myList=m;
}
@凌驾
public int getCount(){
返回myList.size();
}
@凌驾
公共对象getItem(int位置){
返回myList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终int pos=位置;
if(convertView==null){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
convertView=充气机。充气(R.layout.list\u row\u layout,父级,false);
}
TextView text=(TextView)convertView.findViewById(R.id.itemText);
text.setText(myList.get(pos));
//在此按钮上设置onClick侦听器
Button rowButton=(Button)convertView.findViewById(R.id.itemButton);
//注释下两行使列表行可单击
rowButton.setFocusableInTouchMode(假);
rowButton.setFocusable(假);
rowButton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
Toast.makeText(上下文,myList.get(pos),Toast.LENGTH_SHORT.show();
}
});
convertView.setTag(pos);
返回视图;
}
}
您很可能正在onCreate()中完成所有这些操作。任何与视图相关的方法都将返回null(或空),因为列表尚未呈现。您需要子视图做什么?尝试使用ArrayAdapter类,而不是扩展BaseAdapter。对于BaseAdapter,我认为您必须维护对象列表和视图本身。像这样的
public class MyAdapter extends ArrayAdapter<String>
{
...
}
已更新
另外,在构造函数中,您没有调用基类构造函数 getChildAt的实现是什么样子的?您能发布MyListAdapter类的其余部分吗?具体来说,构造函数、getView的整个主体和getCount()的实现?每行都有一个TextView和一个按钮,我需要更改各个按钮的可见性。我正在onResume()中执行此操作。我只是在设置了适配器之后才尝试getChildAt()。您的想法有缺陷。用户滚动按钮后,按钮的可见性将返回默认值。您必须在适配器的getView()
方法中设置适当的可见性。是的,这可能是一个问题,但我打算使用getFirstVisiblePosition()解决它。。。你知道为什么我从getChildAt()得到null吗?:)就像我说的,它还没有被渲染(在onResume()
中并不能保证这一点)。而且,每次用户滚动时,是否都要调用getFirstVisiblePosition()
?你不能那样做,这是错误的。恐怕我不明白。ListAdapter是一个接口,我尝试过实现它,没有任何不同的结果。在构造函数中调用super()也没有效果。我需要尝试super.getView()吗?这对适配器不起作用…哎呀,对不起。我输入了错误的类名。它应该是ArrayAdapter而不是ListAdapter。更新了我的解决方案。