2014-01-30 3 views
1

Так что я скрывался, пытаясь найти ответ на это какое-то время. Я ругаюсь. Мне нужен свежий набор глаз. Мой View getView внутри моего CustomAdapter не вызывается.getView не вызывается из CustomAdapter

public class User_List_Fragment extends ListFragment { 
    View view; 
    DBHelper db; 
    List<UTable> userList; 
    ListView list; 
    TextView id, firstName, lastName, job; 
    String mId; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.view_users_fragment, container, false); 

     list = (ListView) view.findViewById(android.R.id.list); 
     db = new DBHelper(getActivity()); 
     userList = db.getUserList(); 

     class CustomAdapter extends ArrayAdapter<String> { 
      private Context context; 

      public CustomAdapter(Context context, int textViewResourceId, List<UTable> userList) { 
        super(context, textViewResourceId); 
        this.context = context; 
      } 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       View row = convertView; 
       if (row == null) { 
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        row = inflater.inflate(R.layout.custom_list_row, null); 
       } 

       id = (TextView) row.findViewById(R.id.list_id); 
       firstName = (TextView) row.findViewById(R.id.list_first_name); 
       lastName = (TextView) row.findViewById(R.id.list_last_name); 
       job = (TextView) row.findViewById(R.id.list_job);    
       for (UTable uTable : userList) { 
        id.setText(String.valueOf(uTable.getId())); 
        firstName.setText(uTable.getFirstName()); 
        lastName.setText(uTable.getLastName()); 
        job.setText(uTable.getJob()); 

        String mId = String.valueOf(uTable.getId()); 
        String mF = uTable.getFirstName(); 
        String mL = uTable.getLastName(); 
        String j = uTable.getJob(); 

        Log.v("ID", mId); 
        Log.v("First Name", mF); 
        Log.v("Last Name", mL); 
        Log.v("Job", j);      
       }    
       return row; 
      }   
     } 
     list.setAdapter(new CustomAdapter(getActivity().getApplicationContext(), R.layout.custom_list_row, userList)); 
     db.close(); 
     return view; 
    } 
} 

view_users_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <ListView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@android:id/list" 
      android:gravity="center" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/no_data" 
      android:id="@android:id/empty" 
      android:gravity="center"/> 

    </LinearLayout> 

custom_list_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/list_id" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight=".10" 
     android:text="@string/one"/> 

    <TextView 
     android:id="@+id/list_first_name" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight=".25" 
     android:text="@string/first_name_hint"/> 

    <TextView 
     android:id="@+id/list_last_name" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight=".25" 
     android:text="@string/last_name_hint"/> 

    <TextView 
     android:id="@+id/list_job" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight=".5" 
     android:text="@string/job_hint" /> 

</LinearLayout> 

по умолчанию TextView вместо этого вызывается. Это происходит, когда список пуст, и в нем указано «данные не найдены». Я протестировал запрос в базу данных, и он работает. Если я поместил цикл for за пределами моего getView, он вернет результаты. Я думаю, что я использую свой конструктор для своего CustomAdapter, но я не могу понять, как это понять. Любая помощь приветствуется.

EDIT RE-разложенном КОД

User_List_Fragment.java

public class User_List_Fragment extends ListFragment { 
    View view; 
    DBHelper db; 
    List<UTable> userList; 
    ListView list; 
    CustomAdapter adapter; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.view_users_fragment, container, false); 

     db = new DBHelper(getActivity()); 
     userList = db.getUserList(); 

     list = (ListView) view.findViewById(android.R.id.list); 
     adapter = new CustomAdapter(getActivity().getApplicationContext(), R.layout.custom_list_row, userList);  
     list.setAdapter(adapter); 

     db.close(); 
     return view; 
    } 
} 

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<UTable> { 
    private Context context; 

    public CustomAdapter(Context context, int textViewResourceId, List<UTable> userList) { 
     super(context, textViewResourceId); 
     this.context = context; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView== null) { 
      convertView = View.inflate(context, R.layout.custom_list_row, null); 
     } 

     TextView id = (TextView) convertView.findViewById(R.id.list_id); 
     TextView firstName = (TextView) convertView.findViewById(R.id.list_first_name); 
     TextView lastName = (TextView) convertView.findViewById(R.id.list_last_name); 
     TextView job = (TextView) convertView.findViewById(R.id.list_job); 

     UTable uTable = getItem(position); 
     if (uTable != null) { 
      id.setText(String.valueOf(uTable.getId())); 
      firstName.setText(uTable.getFirstName()); 
      lastName.setText(uTable.getLastName()); 
      job.setText(uTable.getJob()); 

      Log.v("JOB", uTable.getJob()); 
     } 
     return convertView; 
    }   
} 
+0

Хорошо, первый очевидный вопрос. Вы определенно проходите, по крайней мере, в одном ряду данных? –

+0

, если вы ссылаетесь на userList, да. Если я перемещу свой цикл за пределы getView, он вернет всех пользователей и их информацию. –

+0

переопределить метод getCount – yahya

ответ

1

Хорошо, я только что быстрый взгляд, вы не понимаете, как использовать адаптер.

GetView вызывается каждой строкой данных, передаваемых в Внутрь получить просмотра у Вас должен просто getItem(position) и заполнить поля с этим объектами данных

Чтобы яснее. - вам не нужен цикл вообще, до тех пор, как вы расширяете в baseadapter где-то в иерархией цикл будет автоматическим

Пример

class CustomAdapter extends ArrayAdapter<UTable> { 

     public CustomAdapter(Context context, int textViewResourceId, List<UTable> userList) { 
       super(context, textViewResourceId, userlist); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView== null) { 
       convertView = View.inflate(R.layout.custom_list_row, null); 
      } 

      //google the view holder pattern when you are more exerienced 
      TextView id = (TextView) row.findViewById(R.id.list_id); 
      TextView firstName = (TextView) row.findViewById(R.id.list_first_name); 
      TextView lastName = (TextView) row.findViewById(R.id.list_last_name); 
      TextView job = (TextView) row.findViewById(R.id.list_job);    

      UTable item = getItem(position); 
      job.setText(item.getJob()); 
      ... 

      return convertView; 
     }   
    } 

Вещи, которые сломаны:

//Java classes should be named like UserListFragment 
    public class User_List_Fragment extends ListFragment { 

    //You shouldnt have these views here, they arent part of the fragmetn 
    //they are part of each row in the list and so will keep changing! 
    TextView id, firstName, lastName, job; 
    String mId; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     ... 

      //You are inside the onCreateView method here - yo ucant decalre a class inside a method! 
      class CustomAdapter extends ArrayAdapter<UTable> { 
+0

Я ценю помощь, и я определенно смущен тем, как это должно работать. Я понимаю, что у меня есть макет с id/list. Этот список должен быть заполнен моим custom_list_row.xml. То, как я это делаю, - это реализовать пользовательский адаптер. Однако я не понимаю, как работает метод getView. BaseAdapter не расширяется нигде, только ArrayAdapter на моем пользовательском адаптере. Я действительно не понимаю, что будет делать getItem (позиция) или где это реализовать. –

+0

Хорошо, ваш адаптер адаптирует список данных, которые вы передаете, в список макетов, отображаемых в списке. Он выполняет работу в get view() -> каждый раз, когда список должен показывать строку ваших данных, потому что она была инициализирована или прокручена, она вызывает getview с позицией, затем вы записываете данные с объекта в этой позиции, в макет, который вы определили в xml. Адаптер делает все остальное для вас! –

+0

getItem (position) предоставит вам элемент в этой позиции массива, который вы передали (список пользователей) –

0

вам необходимо установить CustomAdapter в виде списка. list.setAdapter(customAdapter)

0

вам нужно передать ваши данные в конструктор тоже изменить метод, конструктор с помощью следующего кода:

public CustomAdapter(Context context, int textViewResourceId, List<UTable> userList) { 
     super(context, textViewResourceId , userList); 
     this.context = context; 
      } 

или использовать BaseAdapter класс вместо ArrayAdapter и переопределить GetCount() и GetItem() метод и GetCount возврата метода размер вашего списка

0

причина вашего метода GetView не вызывается это ...

для того, чтобы адаптер знать, сколько строк имеет, у ou должен передавать либо ваши данные из конструктора, либо путем переопределения метода getCount.

Вы ничего не делаете. поэтому адаптер не знает никаких данных.

так

использование любого из этого конструктора пыльник

http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter%28android.content.Context,%20int,%20T[]%29 

http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter%28android.content.Context,%20int,%20int,%20T[]%29 

http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter%28android.content.Context,%20int,%20int,%20T[]%29 

http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter%28android.content.Context,%20int,%20int,%20java.util.List%3CT%3E%29 

или метод коррекции GetCount

http://developer.android.com/reference/android/widget/ArrayAdapter.html#getCount%28%29 

, и вы сделали. надеюсь, что помощь

Смежные вопросы