Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有自定义适配器的Android ListView-getChildAt()返回null_Android_Android Widget_Android Listview_Android Ui - Fatal编程技术网

带有自定义适配器的Android 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

我有一个带有自定义适配器的ListView,我需要访问此ListView的各个行的视图。我正试图使用getChildAt()执行此操作,但它返回null

这是我的列表视图:

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。更新了我的解决方案。