Android ListView с пользовательским адаптером - getChildAt () возвращает ноль - PullRequest
3 голосов
/ 23 ноября 2011

У меня есть ListView с пользовательским адаптером, и мне нужно получить доступ к представлению отдельных строк этого ListView. Я пытаюсь сделать это с помощью getChildAt (), но он возвращает ноль.

Вот мой 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() всегда возвращает ноль.

Чего мне не хватает? Нужно ли добавлять convertView к parent в getView()? Я передаю неверные параметры 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;
    }
}

Ответы [ 2 ]

4 голосов
/ 23 ноября 2011

По всей вероятности, вы делаете все это в onCreate(). Любые связанные с представлением методы будут возвращать ноль (или пустой), потому что список еще не был обработан Для чего вам нужен детский взгляд?

0 голосов
/ 23 ноября 2011

Попробуйте вместо расширения BaseAdapter использовать класс ArrayAdapter.С BaseAdapter я считаю, что вы должны поддерживать как список объектов, так и сами представления.Так что-то вроде этого

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

Тогда вы создадите класс следующим образом.

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

Обновлено Кроме того, в вашем конструкторе вы не вызываете свою базуконструктор класса.

...