2012-02-19 3 views
0

У меня есть переопределяющий класс Object (Guide) с подклассом (сеансом).Статический метод, требуемый для пользовательского адаптера listview

public class Guide 
    private class Session 
    ... 

    ArrayList<Session> sessions; 

    public ArrayList<Session> getSessionsByTrack(int n) { 
    ArrayList<Session> tracks = new ArrayList<Session>(); 
    for (Session session : this.sessions) { 
     if (session.track == n) { 
      tracks.add(session); 
     } 
    } 
    Collections.sort(tracks); // sort by start and end time. 
    return tracks; 
} 

У меня есть ListAdapter, который должен обработать список, чтобы отобразить 2 строки ListView:

public class SessionListAdapter extends BaseAdapter { 
    private ArrayList<Session> sessions; 
    //private Session[] sl; 
    private LayoutInflater mInflater; 

    public SessionListAdapter(Context context, ArrayList<Session> sl) { 
     sessions = sl; 
     mInflater = LayoutInflater.from(context); 
    } 
    public int getCount() { 
     return sessions.size(); 
    } 
    public Object getItem(int position) { 
     return sessions.get(position); 
    } 
    public long getItemId(int position) { 
     return position; 
    } 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.session_two_line_list, null); 
      holder = new ViewHolder(); 
      holder.title = (TextView) convertView.findViewById(R.id.session_title); 
      holder.time = (TextView) convertView.findViewById(R.id.session_time); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.title.setText(sessions.get(position).getTitle()); 
     holder.time.setText(sessions.get(position).getTimeSpan()); 
     return convertView; 
    } 

    static class ViewHolder { 
     TextView title; 
     TextView time; 
    } 
} 

В моей основной деятельности я пытаюсь отобразить список с помощью адаптера списка:

... 
this.lv1 = (ListView) view.findViewById(R.id.SessionListView); 

     // get sessions 
     this.sessionList = Guide.getSessionsByTrack(0); // errors here and complains that this method must be static 
     final SessionListAdapter lv1adapter = new SessionListAdapter(this, this.sessionList); 
     lv1.setAdapter(lv1adapter); 
... 

Моя единственная проблема в методе Guide.getSessionsByTrack не позволяет мне использовать this.sessions, тогда как этот метод является статическим. Должен sessionList быть статичным, что делать, если я хочу обновить список, разве это не должно быть статическим?

Эта маленькая икота - единственное, что удерживает меня от моей цели, и любая помощь будет принята с благодарностью.

ответ

0

У вас есть две проблемы.

Во-первых делать что-то вроде этого ...

Guide.getSessionsByTrack(...); 

... означает, что вы пытаетесь ссылаться на метод, это имя класса родителя, а не с помощью экземпляра ссылки (и экземпляр) в виде Guide объекта. В этом случае, да, метод должен быть объявлен как static, потому что вы явно не создаете экземпляр класса Guide.

Вторая проблема у вас есть то, что getSessionsByTrack(...) не на самом деле метод, который принадлежит сам Guide класса, а он принадлежит к private внутреннему классу (Session). В принципе, этот метод пока недоступен.

Вам необходимо исправить оба этих вопроса до его работы. Либо создайте метод public static в своем классе Guide, который сам по себе вызывает метод static в классе Session или создает экземпляр Guide и предоставляет аналогичный метод get, к которому можно получить доступ публично.

У вас также есть недоразумение о static, так как вы считаете, что вещи не могут быть обновлены. Это будет final (другими словами, «константа») использование static имеет другое значение. Я бы посоветовал вам ознакомиться с использованием Java final и static.

+0

А это все очистило! Это была американская горка для изучения Java. – platinummonkey

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