2017-03-04 106 views
0

我想这样的代码:自动滚动RecyclerView到物品最后位置?

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布局:

?xml version="1.0" encoding="utf-8"?> 
<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> 

如何使这项工作?我已经尝试了很多东西,现在im stucked :)而且我有另一个问题:

如果我更改mAdapter.NotifyItemInserted(mdata.Count());到mAdapter.NotifyItemInserted(0);让物品在顶级回收站查看只是重复的项目,不要把新项目放在视图中。

提前感谢是基于

+0

这听起来像你应该使用[setStackFromEnd()方法(https://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager.html# setStackFromEnd(boolean))或等价的[app:stackFromEnd](https://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager.html#attr_android.support.v7.recyclerview:stackFromEnd)。 – ianhanniballake

+0

您能举个例子吗? –

回答

0

适配器的位置从零开始的索引

变化mAdapter.NotifyItemInserted(mdata.Count())mAdapter.NotifyItemInserted(mdata.Count()-1)

它会自动滚动到最后一个项目

如果仍无法正常工作的 变化也mRecyclerView.SmoothScrollToPosition(mdata.Count())mRecyclerView.SmoothScrollToPosition(mdata.Count()-1)

+0

我试过了,并没有工作。无论如何,它滚动,但只是复制数据,它不显示新项目。不管怎么说,还是要谢谢你。 p.s:它应该自动滚动上下不下降 –

0

试试这个

recyclerView.smoothScrollToPosition(data.size()-1);