2011-11-22 3 views
2

사용자 지정 어댑터가있는 ListView가 있는데이 ListView의 개별 행보기에 액세스해야합니다. getChildAt()를 사용하여이 작업을 수행하려하지만 null을 반환합니다.사용자 지정 어댑터가있는 Android ListView - getChildAt()가 null을 반환합니다.

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); 

내가

myListView = (ListView) findViewById (R.id.listViewLayout); 

이 사용자 정의 어댑터는 다음과 같습니다

내 ListView에의 개별 행에 대한보기에 액세스하려고합니다.

View v = myListView.getChildAt(myListView.getFirstVisiblePosition()); 

이 v는 null입니다. 또한 myListView.getChildCount()은 항상 null을 반환합니다.

무엇이 누락 되었습니까? getView()convertViewparent에 추가해야하나요? 잘못된 매개 변수를 inflate에 전달하고 있습니까?

나는 이것을 알아 내기 위해 많은 어려움을 겪었습니다. 제발 도와주세요! 나는 MyListAdapter 클래스를 게시하고있다 :

편집이 onCreate()이 모든 일을하는지 모든 가능성에

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

답변

4

. 리스트가 아직 렌더링되어 있지 않기 때문에 뷰 관련 메소드는 null (또는 하늘)을 돌려줍니다. 어린이보기가 필요한 것은 무엇입니까?

+0

각 행에는 TextView와 Button이 있으며 개별 버튼의 가시성을 변경해야합니다. – Chaitanya

+0

나는 onResume()에서 이것을하고있다. 나는 어댑터를 설정 한 후에 getChildAt()를 시도하고있다 ... – Chaitanya

+0

당신의 생각에는 결함이있다. 사용자가 버튼을 스크롤하면 가시성이 기본값으로 돌아갑니다. 어댑터의 getView() 메소드에서 적절한 가시성을 설정해야합니다. – dmon

0

BaseAdapter를 확장하는 대신 ArrayAdapter 클래스를 사용하십시오. 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, 죄송합니다. 나는 틀린 학급 이름을 넣었다. ListAdapter 대신 ArrayAdapter가 있어야합니다. 내 솔루션을 업데이트했습니다. – Wizetux

관련 문제