Emin Kokalari Ответов: 0

Как автоматически прокрутить recyclerview до последней позиции элемента ? в Xamarin.андроид


Мой код таков, но не работает :
public class ping : SupportFragment
{
View view;
RecyclerView mRecyclerView;
RecyclerView.LayoutManager mLayoutManager;
RecyclerView.Adapter mAdapter;
public List<data> mdata;
int i = 0;


public override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
}

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    view = inflater.Inflate(Resource.Layout.ping, container, false);
    mRecyclerView = view.FindViewById<RecyclerView>(Resource.Id.recyclerview_ping);
    mLayoutManager = new LinearLayoutManager(Activity);
    mRecyclerView.SetLayoutManager(mLayoutManager);
    mdata = new List<data>();
    mAdapter = new RecyclerAdapter(mdata,mRecyclerView);
    mRecyclerView.SetAdapter(mAdapter);
    mRecyclerView.SetItemClickListener((rv, position, view) =>
    {
        //An item has been clicked
        Toast.MakeText(mRecyclerView.Context, mdata[position].sekuenca, ToastLength.Long).Show();

    });
    Task.Run(() => add_data());

    return view;
}

public void add_data()
{
    fillimi:
    Activity.RunOnUiThread(() =>
    {
        i = i + 1;
        string sekuena = i.ToString();
        mdata.Add(new data() { titulli = "From : eakteam.com", sekuenca = "Secuenca : " + sekuena, madhesia = "Send : 64 Bytes", koha = "Time : 45 ms" });
        mAdapter.NotifyItemInserted(mdata.Count());
        mRecyclerView.SmoothScrollToPosition(mdata.Count());
    });

    Thread.Sleep(2000);
    goto fillimi;
}
public class data
{
    public string titulli { get; set; }
    public string sekuenca { get; set; }
    public string madhesia { get; set; }
    public string koha { get; set; }
}
public class RecyclerAdapter : RecyclerView.Adapter
{
    private List<data> mdata;
    private RecyclerView mRecyclerView;
    public RecyclerAdapter(List<data> data, RecyclerView recyclerView)
    {
        mdata = data;
        mRecyclerView = recyclerView;
    }
    public class MyView : RecyclerView.ViewHolder
    {
        public View mMainView { get; set; }
        public TextView mtitulli { get; set; }
        public TextView msekuenca { get; set; }
        public TextView mmadhesia { get; set; }
        public TextView mkoha { get; set; }

        public MyView(View view) : base(view)
        {
            mMainView = view;
        }
    }
    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.ping_lista, parent, false);

        TextView txtTitulli = row.FindViewById<TextView>    (Resource.Id.titulli);
        TextView txt1 = row.FindViewById<TextView>(Resource.Id.txt1);
        TextView txt2 = row.FindViewById<TextView>(Resource.Id.txt2);
        TextView txt3 = row.FindViewById<TextView>(Resource.Id.txt3);

        MyView view = new MyView(row) { mtitulli = txtTitulli, msekuenca = txt1, mmadhesia = txt2, mkoha = txt3 };
        return view;
    }
    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        MyView mHolder = holder as MyView;
        int indexPosition = (mdata.Count - 1) - position;
        mHolder.mtitulli.Text = mdata[position].titulli;
        mHolder.msekuenca.Text = mdata[position].sekuenca;
        mHolder.mmadhesia.Text = mdata[position].madhesia;
        mHolder.mkoha.Text = mdata[position].koha;
    }
    public override int ItemCount
    {
        get { return mdata.Count; }
    }
    public override long GetItemId(int position)
    {
        return base.GetItemId(position);
    }
}
}

РАЗМЕТКА XAML-ЭТО :

<LinearLayout 

    xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent">
  <LinearLayout

        android:id="@+id/linear_device"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:gravity="center"

        android:orientation="horizontal"

        >
      <Button

          android:text="Add Device"

          android:layout_width="206.0dp"

          android:layout_height="43.3dp"

          android:id="@+id/button_device_vazhdo"

          android:layout_gravity="center"

          android:layout_marginStart="10dp"

          android:layout_marginRight="10dp"

          android:layout_marginBottom="10dp"

          android:background="@android:color/holo_green_dark" />
    </LinearLayout>
  <LinearLayout 

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent">
  <android.support.v7.widget.RecyclerView

    android:id="@+id/recyclerview_ping"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:scrollbars="vertical"

    />
  </LinearLayout>
</LinearLayout>



Как сделать эту работу ? я много чего перепробовал и теперь застрял :)
И у меня есть еще одна проблема кроме этой :

если я изменю mAdapter.NotifyItemInserted(mdata.Граф ()); к мадаптеру.NotifyItemInserted(0); чтобы сделать элементы обезьянничающими на вершине recyclerview, просто дублируйте элемент и не помещайте новый элемент в поле зрения.

Заранее спасибо

Что я уже пробовал:

mAdapter.NotifyItemInserted(mdata.Count() -1);
mRecyclerView.SmoothScrollToPosition(mdata.Count() -1);


Это не должно быть сделано с помощью "reverseLayout"

Graeme_Grant

Вы задавали этот вопрос в Форумы Android-Xamarin[^]?

Emin Kokalari

Да, но решения пока нет ... я подумал, может быть, найду здесь какое-нибудь решение.

0 Ответов