статический метод, необходимый для настраиваемого адаптера списка - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть переопределенный класс Object (Guide) с подклассом (Session).

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, который должен обрабатывать список для отображения двухстрочного списка:

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 быть статичным, что если я хочу обновить список, разве это не должно быть статичным?

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

1 Ответ

0 голосов
/ 19 февраля 2012

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

Сначала делаем что-то вроде этого ...

Guide.getSessionsByTrack(...);

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

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

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

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

...