带有自定义适配器的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()中添加convertViewparent吗?我通过错误的参数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; 
    } 
} 
+0

getChildAt的实现看起来像什么? –

+0

你可以发布你的MyListAdapter类的其余部分吗?具体来说,构造函数,getView的完整体和getCount()的实现? – Chris

在你做的这一切在onCreate()所有的可能性。任何视图相关的方法将返回null(或空),因为该列表尚未呈现。你需要什么儿童观?

+0

每行都有一个TextView和一个按钮,我需要更改各个按钮的可见性。 – Chaitanya

+0

我在onResume()中这样做。我只是在设置适配器后才尝试getChildAt()... – Chaitanya

+0

你的想法是有缺陷的。只要用户滚动您的按钮,可见性将回到默认值。您必须在适配器的'getView()'方法中设置适当的可见性。 – dmon

尝试使用ArrayAdapter类来代替扩展BaseAdapter。使用BaseAdapter,我相信你必须保持对象列表和视图本身。所以像这样的东西

public class MyAdapter extends ArrayAdapter<String> 
{ 
... 
} 

然后你会创建这样的类。

MyListAdapter myListAdapter = new MyListAdapter(getApplicationContext(), R.layout.list_row_layout, myList); 

更新 此外,在构造函数中,你是不是叫你的基类的构造函数。

+0

恐怕我没有得到它。 ListAdapter是一个接口,我试着实现它,没有任何不同的结果。在构造函数中调用super()也没有效果。我需要尝试super.getView()吗?这对适配器不起作用... – Chaitanya

+0

Opps,对不起。我输入了错误的类名。它应该是ArrayAdapter而不是ListAdapter。更新我的解决方案 – Wizetux