ScrollToPosition用于延迟加载RecyclerView

时间:2018-11-12 12:55:15

标签: android android-recyclerview infinite-scroll

我正在尝试为android中的消息传递构建一个简单的活动。

  
      
  • 我有一个RecyclerView列出了邮件,并在其上设置了ScrollListener
  •   
  • firstVisibleItem在列表(RecyclerView stack from end)的第三位时,我将调用以加载其他元素。
  •   
  • 我将此元素添加到数组中,并在RecyclerView上设置了新适配器以进行更新。
  •   
  • 设置新适配器后,该列表将从上一条消息开始再启动一次。
  •   
  • 到目前为止,我尝试使用scrollToPosition转到用户触发scrollListener之前的消息,但是仍然无法正常工作,因为lastVisibleItem每次都变为1 。
  •   

重置适配器后,是否可以维护最后一个firstVisible元素并将该元素设置为顶部元素?

这是onCreateMethod

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.chat);

    lastOffset = 0;
    requestSize = 20;

   loadMessage()

    mAdapter = new ChatAdapter(this,mess);
    llm = new LinearLayoutManager(this);
    llm.setStackFromEnd(true);
    mex_list.setLayoutManager(llm);
    mex_list.setAdapter(mAdapter);
    mex_list.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            int lastVisible = llm.findLastVisibleItemPosition();
            int firstVisible = llm.findFirstVisibleItemPosition();
            lastFirstVisibleItem = firstVisibleItem; //lastFirstVisibleItem is a global variable
            if(firstVisible <= 3){
                if(!loading) {
                    loading = true;
                    loadMessage();
                }
            }
            Log.d("Test Scroll", "LAST: "+ lastVisible+" FIRST: "+firstVisible);
        }
    });}

这是管理laodMessage()结果的地方。

 public void manageResult(Object pr, int caller) {
    if(caller == MESSAGES_REQ){
        if(mess == null)
            mess = new ArrayList<>();
        ArrayList<Message> tail = (ArrayList<Message>) pr;

        if(tail != null && tail.size() > 0) {
            lastOffset += tail.size();
            mess.addAll(tail);
            mAdapter = new ChatAdapter(ctx, mess);
            mex_list.setAdapter(mAdapter);
        }

        llm.scrollToPosition(lastFirstVisibleItem);//lastFirstVisibleItem became always 1
        spinner.setVisibility(View.GONE);
        printEmpMex(View.GONE);
        mex_list.setVisibility(View.VISIBLE);
        loading = false;
    }
}

这是ChatAdapter

public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ViewHolder> {

private ArrayList<Message> listOfMessages;
private static Context ctx;

private static final int SENT = 100;
private static final int RECIVED = 200;

public static class ViewHolder extends RecyclerView.ViewHolder {
    public TextView text;
    public TextView hour;


    public ViewHolder(View v) {
        super(v);
        text = (TextView) v.findViewById(R.id.text_body);
        hour = (TextView) v.findViewById(R.id.time);
    }

    void bind(Message m){
        text.setText(m.getBody());
        hour.setText(formatDateAndHour(m.getDate()));
    }
}

public ChatAdapter(Context ctx, ArrayList<Message> m) {
    listOfMessages = m;
    this.ctx = ctx;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent,
                                     int viewType) {

    View view;
    if (viewType == SENT) {

        view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.single_mex_sent, parent, false);
        return new ViewHolder(view);

    }
    else if (viewType == RECIVED){

        view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.single_mex_recived, parent, false);
        return new ViewHolder(view);
    }

    return null;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Message mex = listOfMessages.get(position);
    holder.bind(mex);
}

@Override
public int getItemCount() {
    return listOfMessages.size();
}

@Override
public int getItemViewType(int position) {
    Message m = listOfMessages.get(position);
    if(m.getSender().getIdUser().equals(loggedUser.getIdUser()))
        return SENT;
    else
        return RECIVED;
}}

我真的不知道如何使它工作。 每种方法都欢迎。

谢谢。

0 个答案:

没有答案