Skip to content

Instantly share code, notes, and snippets.

@uhfath
Created January 20, 2017 06:34
Show Gist options
  • Save uhfath/30fd773702e51e788c8b64a93962329a to your computer and use it in GitHub Desktop.
Save uhfath/30fd773702e51e788c8b64a93962329a to your computer and use it in GitHub Desktop.
DividerItemDecoration artifacts when updating items
package com.company.user.recyclerviewdecorationtest;
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.Arrays;
import java.util.Random;
import static android.support.v7.widget.RecyclerView.NO_POSITION;
public class MainActivity extends AppCompatActivity {
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
}
}
private String[] testList;
private RecyclerView.Adapter<ViewHolder> modelAdapter;
private static final String alphabet = "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz";
private static String[] generateTestData() {
Random random = new Random();
int count = 3;// + random.nextInt(100);
String[] dataList = new String[count];
for (int i = 0; i < count; i++) {
int length = 10 + random.nextInt(100);
StringBuilder stringBuilder = new StringBuilder(length);
for (int j = 0; j < length; j++) {
stringBuilder.append(alphabet.charAt(random.nextInt(alphabet.length())));
}
dataList[i] = stringBuilder.toString();
}
return dataList;
}
private static void truncateTestDataItems(String[] dataList) {
for (int i = 0; i < dataList.length; i++) {
if (!dataList[i].isEmpty()) {
dataList[i] = dataList[i].substring(0, dataList[i].length() - 1);
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testList = generateTestData();
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
DividerItemDecoration itemDecoration = new DividerItemDecoration(this, layoutManager.getOrientation());
recyclerView.addItemDecoration(itemDecoration);
modelAdapter = new RecyclerView.Adapter<ViewHolder>() {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View root = getLayoutInflater().inflate(R.layout.list_item, parent, false);
return new ViewHolder(root);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
TextView textView = (TextView) holder.itemView.findViewById(R.id.text_view);
textView.setText(testList[position]);
}
@Override
public int getItemCount() {
return testList.length;
}
};
recyclerView.setAdapter(modelAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("NEW").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add("PAYLOAD").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add("EMPTY").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getTitle().equals("NEW")) {
testList = generateTestData();
modelAdapter.notifyDataSetChanged();
return true;
}
if (item.getTitle().equals("PAYLOAD")) {
truncateTestDataItems(testList);
modelAdapter.notifyItemRangeChanged(0, modelAdapter.getItemCount(), "payload");
return true;
}
if (item.getTitle().equals("EMPTY")) {
truncateTestDataItems(testList);
modelAdapter.notifyItemRangeChanged(0, modelAdapter.getItemCount());
return true;
}
return super.onOptionsItemSelected(item);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment