Created
January 20, 2017 06:34
-
-
Save uhfath/30fd773702e51e788c8b64a93962329a to your computer and use it in GitHub Desktop.
DividerItemDecoration artifacts when updating items
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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