Mam RecyclerView, który dodaje elementy każdego określonego okresu. Podczas dodawania obiektów, jeśli elementy listy są większe niż (powiedzmy) 500, to pierwsze elementy zostaną usunięte, a nowe elementy zostaną dodane.usuwanie RecyclerView przedmiotów
Jeśli RecyclerView nie może już przewinąć w dół !recyclerView.canScrollVertically(1);
, to po dodaniu nowych pozycji RecyclerView osiągnie smoothScroolToPosition()
do ostatniej pozycji.
Gdzie jest problem? OK, jeśli ReyclerView znajduje się pośrodku (nie na dole, nie na górze) podczas usuwania starych przedmiotów, nagle podskoczy kilka pozycji w górę. Chcę RecyclerView nie skakać pozycję i pozostać tam, gdzie to było, gdy usuwanie elementów w górnym
Próbowałem za pomocą layoutManager.setStackFromEnd(true);
ale bez powodzenia
Wszelkie sugestie?
Kod (niepowiązany kod jest usuwany). Mój problem może być powielana gdy RecyclerView wyświetla listę elementów ze środkowej i prasy VOLUME_UP:
public class ActivityMain extends ActionBarActivity {
public static final int MAX_LOG_ITEMS = 500;
private RecyclerView mRecyclerView;
private AdapterLog mRecyclerAdapter;
private boolean mAutoScroll = true;
private DataReceiver mDataReceiver;
private Handler mLogHandler = new Handler() {
@Override public void handleMessage(Message msg) {
switch (msg.what){
case DataReceiver.CAT_LOGS:
List<Log> catLogs = (List<Log>) msg.obj;
updateLogs(catLogs);
break;
case DataReceiver .CLEAR_LOGS:
if (mRecyclerAdapter.getItemCount() > MAX_LOG_ITEMS)
mRecyclerAdapter.removeFirstItems(mRecyclerAdapter.getItemCount() - MAX_LOG_ITEMS);
break;
case Logcat.REMOVE_LOGS:
mRecyclerAdapter.clear();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setStackFromEnd(true);
mRecyclerAdapter = new AdapterLog();
mRecyclerView = (RecyclerView) findViewById(R.id.activity_main_recyclerview);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(mRecyclerAdapter);
mRecyclerView.setOnScrollListener(new UIUtils.ScrollManager(toolbarContainer != null ?
toolbarContainer : toolbar){
@Override public void onScrolled(RecyclerView r, int dx, int dy) {
super.onScrolled(r, dx, dy);
mAutoScroll = !r.canScrollVertically(1);
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode){
case KeyEvent.KEYCODE_VOLUME_UP:
// mAutoScroll = false;
// mRecyclerView.scrollToPosition(0);
// if (mRecyclerAdapter.getItemCount() > MAX_LOG_ITEMS)
mRecyclerAdapter.removeFirstItems(mRecyclerAdapter.getItemCount() - 50);
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
mAutoScroll = true;
mRecyclerView.scrollToPosition(mRecyclerAdapter.getItemCount() -1);
return true;
}
return false;
}
private void updateLogs(final List<Log> logList) {
final boolean scroll = mAutoScroll;
mRecyclerAdapter.addAll(logList);
if (scroll) mRecyclerView.smoothScrollToPosition(mRecyclerAdapter.getItemCount() - 1);
}
}
The RecyclerAdapter:
public class AdapterLog extends RecyclerView.Adapter<AdapterLog.ViewHolder> {
private final List<Log> mLogList;
public AdapterLog() {
this.mLogList = new ArrayList<Log>();
}
@Override
public AdapterLog.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.listitem_log, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTextView.setText(getItem(position).getMessage());
holder.mTextView.setTextColor(getItem(position).getLevel().getColor());
}
@Override
public int getItemCount() {
return mLogList.size();
}
public Log getItem(int position) {
return mLogList.get(position);
}
public void addAll(List<Log> logList) {
mLogList.addAll(logList);
notifyDataSetChanged();
}
public void removeFirstItems(int count) {
for (int i=0; i<count; i++) mLogList.remove(0);
notifyDataSetChanged();
}
public void clear() {
mLogList.clear();
notifyDataSetChanged();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View v) {
super(v);
mTextView = (TextView) v.findViewById(R.id.listitem_log_textview);
}
}
}
Czy nazywasz 'notififyDataSetChanged'? –
tak, z adaptera podczas połączenia dodaj lub usuń. Aktualizuję kod – BamsBamx
Zmień 'notifyDataSetChanged();' na twoim 'removeFirstItems' na' notifyItemRangeRemoved (0, count) 'dla lepszej wydajności –