RecyclerView - 逆序

时间:2017-09-12 05:01:24

标签: android

我以相反的顺序使用回收站视图来显示聊天记录 如果聊天中只有一条消息,它会在底部显示消息(如电报)。但我需要从顶部显示它 我被困在这一天。任何人都可以给我一个建议,以回收顺序(如whatsapp)从顶部​​显示消息。

11 个答案:

答案 0 :(得分:13)

我某天前遇到同样的问题。无论我通过这种方式解决这个问题。

<android.support.v7.widget.RecyclerView
        android:id="@+id/reyclerview_message_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        app:stackFromEnd="true"
        app:reverseLayout="true"/>

答案 1 :(得分:13)

您还可以使用此:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
myRecyclerView.setLayoutManager(linearLayoutManager);

答案 2 :(得分:9)

您可以使用 Collections.reverse(arrayList); 方法以相反的顺序显示聊天记录 试试这个

ArrayList<Model> list = getList();
Collections.reverse(list);
MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter (YourActivity.this, list);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));

答案 3 :(得分:2)

<块引用>

Android recyclerview 在 kotlin 中逆序或逆向布局

val linearLayoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true)
linearLayoutManager.stackFromEnd = true

答案 4 :(得分:1)

这是Java最短的解决方案:

LinearLayoutManager lm = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true); // last argument (true) is flag for reverse layout
myRecyclerView.setLayoutManager(lm);

答案 5 :(得分:0)

我遇到了同样的问题,但是从它自己的适配器解决了它。

当您添加(例如)JSONArray时,您可以按如下方式反转循环;

for (int i=pDate.length()-1; i > -1 ; i--) {
       try {
            tModelList.add(new tModel(pData.getJSONObject(i)));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

答案 6 :(得分:0)

将其用于onBindViewHolder中的适配器位置

final int posRevers = list.size() - (position + 1);

答案 7 :(得分:0)

我只是在RecyclerView适配器中更改了ViewHolder计数器顺序。

我已经更改了此

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
    viewHolder.yourTextView.setText(mEntry.get(i));
}

为此:

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
    viewHolder.yourTextView.setText(mEntry.get(getItemCount()-i-1));
}

答案 8 :(得分:0)

我以这种方式做了类似的事情:

layoutManager = LinearLayoutManager(context).apply {stackFromEnd = true}

然后根据时间反向排列记录

mCursor = contentResolver.query(Uri.parse("content://sms"),
                arrayOf("body", "date", "type"),
                "address like ?",
                arrayOf("%$id"),
                "date asc")

答案 9 :(得分:0)

与Kotlin:

  mList.asReversed()  // mList : List<Modelo>

答案 10 :(得分:0)

是的,实现此目标的方法不同,但有一个问题是,添加新项目后,回收者视图将不会显示新项目,您必须手动向下滚动列表。这不是用户友好的。为了解决这个问题,我使用了RecyclerView.smoothScrollToPosition

使用xml进行操作(不要忘记以编程方式删除您附加的LinearLayoutManager):

<android.support.v7.widget.RecyclerView
        android:id="@+id/recordItemList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:clipToPadding="false"
        android:scrollbars="none"
        app:layoutManager="LinearLayoutManager"
        app:stackFromEnd="true"
        app:reverseLayout="true"/>

然后在添加新项目时调用smoothScrollToPosition

int newIndex = myArraylist.size();
myArraylist.add(newItem);
notifyItemInserted(newIndex)
myRecyclerView.smoothScrollToPosition(newIndex);

或以编程方式通过以下方式反转您的列表:

Collections.reverse(myArraylist);

就在设置适配器之前。

并致电smoothScrollToPosition。这次,newIndex为0

int newIndex = 0
myArraylist.add(newIndex,newItem);
notifyItemInserted(newIndex)
myRecyclerView.smoothScrollToPosition(newIndex);