0

正常に動作する CustomListAdapter を作成しましたが、リストをすばやくスクロールすると、かなりの数のガベージ コレクション メッセージが表示されます。

効率的なカスタム ListAdapter を作成するためのベスト プラクティスはありますか?

これが私が今持っているものです。何がうまくいくのですか?

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    RelativeLayout centreView;
    //Get the current alert object

    if (convertView == null) {
        centreView = new RelativeLayout(getContext());
        LayoutInflater vi;
        vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        vi.inflate(resource, centreView, true);
    }
    else
    {
        centreView = (RelativeLayout) convertView;
    }

    TextView name = (TextView) centreView.findViewById(R.id.class_name);
    TextView venue = (TextView) centreView.findViewById(R.id.class_venue);
    TextView time = (TextView) centreView.findViewById(R.id.class_time);
    TextView room = (TextView) centreView.findViewById(R.id.class_room);
    TextView id = (TextView) centreView.findViewById(R.id.class_id);
    TextView dayTV = (TextView) centreView.findViewById(R.id.class_day);
    TextView desc = (TextView) centreView.findViewById(R.id.class_description);
    TextView json = (TextView) centreView.findViewById(R.id.class_json);

    String timeString;
    try {
        JSONObject thisRow = items.get(position);
        name.setText(thisRow.getString("className"));

        dayTV.setText(thisRow.getString("theDate"));
        json.setText(thisRow.toString());
        venue.setText(thisRow.getString("venue"));
        final String ID = thisRow.getString("id");
        id.setText(ID);


        desc.setText(thisRow.getString("description"));


        timeString = thisRow.getString("startTime");
        timeString += " - "+thisRow.getString("endTime");
        time.setText(timeString);



        room.setText(thisRow.getString("room"));


        final Button alter = (Button) centreView.findViewById(R.id.is_alt);
        alter.setVisibility(View.INVISIBLE);
        final JSONArray alterations = thisRow.getJSONArray("alteration");

        if (alterations.getJSONObject(0).getString("show").equals("yes")) {
            alter.setVisibility(View.VISIBLE);
            alter.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    ActivityViewTimetable actVT = (ActivityViewTimetable) getContext();
                    actVT.showAlterations(alterations);
                }
            });
        }


    } catch (JSONException e) {
        Log.e("FUApp", "JSON Error (TimetableItemsArrayAdapter): " + e.getMessage());
    }

    return centreView;
}

PS。私が参照している TextView の一部はもう必要ありません。現時点ではどれを整理しているだけです。

編集:これは私が終わったものです

static class ViewHolder {
    TextView name;
    TextView venue;
    TextView time;
    TextView room;
    TextView id;
    TextView dayTV;
    TextView desc;
    TextView json;
    JSONObject jsonObj;
    String classNameString;
    String theDate;
    String venueString;
    String idString;
    String description;
    String startTime;
    String endTime;
    String roomString;
    JSONArray alterations;
}

 if (convertView == null) {
        centreView = new RelativeLayout(getContext());
        LayoutInflater vi;
        vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        vi.inflate(resource, centreView, true);
        holder = new ViewHolder();
        holder.name = (TextView) centreView.findViewById(R.id.class_name);
        holder.venue = (TextView) centreView.findViewById(R.id.class_venue);
        holder.time = (TextView) centreView.findViewById(R.id.class_time);
        holder.room = (TextView) centreView.findViewById(R.id.class_room);
        holder.id = (TextView) centreView.findViewById(R.id.class_id);
        holder.dayTV = (TextView) centreView.findViewById(R.id.class_day);
        holder.desc = (TextView) centreView.findViewById(R.id.class_description);
        holder.json = (TextView) centreView.findViewById(R.id.class_json);
        holder.jsonObj = items.get(position);
        try {
            holder.classNameString = holder.jsonObj.getString("className");
            holder.theDate = holder.jsonObj.getString("theDate");
            holder.venueString = holder.jsonObj.getString("venue");
            holder.idString = holder.jsonObj.getString("id");
            holder.description = holder.jsonObj.getString("description");
            holder.startTime = holder.jsonObj.getString("startTime");
            holder.endTime = holder.jsonObj.getString("endTime");
            holder.roomString = holder.jsonObj.getString("room");
            holder.alterations = holder.jsonObj.getJSONArray("alteration");
        }
        catch (JSONException e) {
            Log.e("FUApp", "JSONError getting details: "+e.getMessage());
        }
        centreView.setTag(holder);
    }

これを使用すると、私のリストはまったく遅れません。

4

2 に答える 2

0

実際、それが最善の方法のように見えます。リストビューは、すでに作成されていても画面に表示されないすべてのアイテムで getView を呼び出します。これらの行のおかげで:

   if (convertView == null) {
    centreView = new RelativeLayout(getContext());
    LayoutInflater vi;
    vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    vi.inflate(resource, centreView, true);
}

ビューが再度作成されることはありません。あなたはこの部分のために最善を尽くしていると思います。

データを効率的に保存するための viewHolder パターンもありますが、私は使用したことがありません。;))。

于 2013-09-06T10:21:22.450 に答える