listview自定义适配器所需的静态方法

时间:2012-02-19 02:07:37

标签: android listadapter baseadapter

我有一个重写的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应该处理列表以显示2行列表视图:

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 :(得分:0)

你有两个问题。

首先做这样的事情......

Guide.getSessionsByTrack(...);

...表示您尝试通过它的父类名称而不是通过Guide对象的引用(和实例化)实例来引用方法。在这种情况下,是的,该方法必须声明为static,因为您没有显式实例化Guide类的实例。

您遇到的第二个问题是getSessionsByTrack(...)实际上不是属于Guide类本身的方法,而是属于private内部类({{1} })。基本上这种方法无论如何都无法达到。

你需要先解决这两个问题才能解决问题。在Session类中创建public static方法,该方法本身在Guide类中调用static方法,或创建Session的实例并提供类似的方法可以公开访问的Guide方法。

此外,您似乎对get存在误解,因为您认为这意味着无法更新内容。那将是static(换句话说'常数')final的使用具有不同的含义。我建议您阅读Java staticfinal用法。