Как сохранить положение полосы прокрутки сетки при обновлении данных - PullRequest
1 голос
/ 28 октября 2019

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

Какой самый простой способ при загрузке данных в виде сетки сохранить позицию полосы прокрутки в текущей позиции?

public class TextAdapter : BaseAdapter
    {
        Context context;

        List<string> Sources;

        string res;

        public TextAdapter(Context c, List<string> s)
        {
            context = c;
            Sources = s;
        }

        public override int Count
        {
            get { return Sources.Count; }
        }

        public override Java.Lang.Object GetItem(int position)
        {
            return null;
        }

        public override long GetItemId(int position)
        {
            return 0;
        }

        // create a new ImageView for each item referenced by the Adapter
        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            TextView textView;

            if (convertView == null)
            {
                textView = new TextView(context);
                textView.SetLines(6);
            }
            else
            {
                textView = (TextView)convertView;
            }

            textView.SetText(Sources[position], null);

            return textView;
        }

Какой самый простой способ при загрузке данных в виде сетки сохранить положение полосы прокрутки в текущей позиции?

Сетка:

<GridView
android:id="@+id/gvContagem"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:numColumns="1"
android:textStyle="bold"
android:layout_below="@+id/headerLabel"
android:layout_marginTop="33dp" />

.CS Файл:

 readonly JavaList<String> artigos = new JavaList<string>();

    List<string> mItems = new List<string>();

    GridView gvContagem = FindViewById<GridView>(Resource.Id.gvContagem);
    sqliteConnection con = new SqliteConnection("Data Source = " + BaseDados);

    con.Open();

    artigos.Clear();

    string stm = "SELECT Artigo, Descricao FROM Trend";

    using (SqliteCommand cmd = new SqliteCommand(stm, con))
    {
        using (SqliteDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {

                artigos.Add(rdr.GetValue(0) + rdr.GetValue(1));


            }

        }

    }

gvContagem.Adapter = new TextAdapter(this,artigos);

1 Ответ

1 голос
/ 29 октября 2019

Мне удалось сделать рабочий образец с довольно минимальными усилиями, как оказалось.

Попробуйте выполнить следующее (добавив две строки кода, одну до и одну после создания нового TextAdapter:

IParcelable gridViewState = gvContagem.OnSaveInstanceState(); // <-- save scroll position
gvContagem.Adapter = new TextAdapter(this, artigos);
gvContagem.OnRestoreInstanceState(gridViewState); // <-- Load scroll position

Я проверил вышеупомянутое, и это работает, но если новыйнабор данных меньше, чем старый набор данных, и вы прокручивали старый набор данных до предела, где расширяется новый набор данных, тогда новые данные будут прокручиваться до конца. Другими словами, если старый набор данных содержал 20 элементови новый набор данных содержит 10 элементов, и вы прокручивались так, чтобы элемент 15 находился внизу, при загрузке нового меньшего набора данных вы будете прокручиваться так, чтобы элемент 10 находился внизу.

Кстати, здесь был получен несколько дублирующий вопрос: Сохранение позиции прокрутки GridView с помощью поворота экрана , но с собственным кодом Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...