0

次の例を考えてみましょう。リスト項目の順序は getView() メソッドをオーバーライドする直前に正しいです。追加の作業を行うためにオーバーライドするたびに(例には示されていません)、アイテムの順序は本当に混乱します。下にスクロールして数字を表示し、上にスクロールして同じ数字をもう一度表示します。その奇妙な動作の原因は何ですか?どうすれば修正できますか?

package com.staticlist;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

public class MainActivity extends ListActivity {
    String[] items = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16",
            "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33",
            "34", "35", "36", "37", "38", "39", "40" };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new MyListAdapter(this, R.layout.main, items));
    }
}

class MyListAdapter extends ArrayAdapter<String> {
    public MyListAdapter(MainActivity mainActivity, int main, String[] items) {
        super(mainActivity, main, items);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row;

        if (convertView == null) {
            row = super.getView(position, convertView, parent);
        } else {
            row = convertView;
        }

        return row;
    }
}
4

2 に答える 2

1

新しいビューを作成せず、下にスクロールするときに古いビューを使用しているため (その時点で convertView は null にならない)

この方法を試してみてください。

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return super.getView(position, convertView, parent);
    }

ArrayAdapter には既に同じロジックがあるため、これを行う必要があります (ここでは convertview を使用します)。

widget/ ArrayAdapter.javaから

public View getView(int position, View convertView, ViewGroup parent) {
        return createViewFromResource(position, convertView, parent, mResource);
    }

    private View createViewFromResource(int position, View convertView, ViewGroup parent,
            int resource) {
        View view;
        TextView text;

        if (convertView == null) {
            view = mInflater.inflate(resource, parent, false);
        } else {
            view = convertView;
        }

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java

于 2012-06-27T12:23:24.617 に答える
0

カスタムArrayAdapterを使用している場合は、以下を追加する必要があります。

adapter.sort(new Comparator<String>() {

            @Override
            public int compare(String lhs, String rhs) {
                if (Integer.parseInt(lhs) == Integer.parseInt(rhs))
                    return 0;
                else if (Integer.parseInt(lhs) > Integer.parseInt(rhs))
                    return 1;
                else
                    return -1;
            }
        });
adapter.notifyDataSetChanged();
于 2012-06-27T13:08:54.580 に答える