So I have this piece of code I've been working on for quite some time. It's a ListView with a search filter. Inside each row, it contains a user Image, a User's name and how many friends they have in common. Also the row contains a button each, for actions. I'm just indeed of some code refactoring, maybe some guidance? Different collections that I could use to tone the heavy code down. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); res = getResources(); searchField = (EditText) findViewById(R.id.EditText01); lv = (ListView) findViewById(android.R.id.list); lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE); list = new ArrayList<Friend>(); friendList2 = new ArrayList<Friend>(); nameBlock = res.getStringArray(R.array.names); descBlock = res.getStringArray(R.array.descriptions); names = new ArrayList<String>(); for(int i = 0; i < nameBlock.length; i++) { names.add((String)nameBlock[i]); } descr = new ArrayList<String>(); for(int i = 0; i < descBlock.length; i++) { descr.add((String)descBlock[i]); } images = new ArrayList<Integer>(); for(int i = 0; i < imageBlock.length; i++) { images.add((Integer)imageBlock[i]); } //imageBlock = res.getIntArray(R.array.images); int size = nameBlock.length; for(int i = 0 ; i < size; i++) { Log.d("FREINDADD", "Freind Added" + i); list.add(new Friend(i, names.get(i), descr.get(i), images.get(i), false)); friendList2.add(new Friend(i, names.get(i), descr.get(i), images.get(i), false)); //friendList2.add(new Friend(i, names.get(i), descr.get(i), images.get(i))); } Log.i("Application", "Application started succesfully..."); adapter = new CustomAdapter(this); setListAdapter(adapter); Log.i("VIRTU", "Count" + adapter.getCount()); //adapter.getCount(); searchField.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) {} @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { list.clear(); textlength = searchField.getText().length(); for (int i = 0; i < names.size(); i++) { if (textlength <= names.get(i).length()) { if(names.get(i).toLowerCase().contains(searchField.getText().toString().toLowerCase().trim())) { Log.i("VirtuFriendList", "List recyling in process... "); list.add(new Friend(i, names.get(i), descr.get(i), images.get(i), false)); } } } AppendList(list); } }); } public void AppendList(ArrayList<Friend> list) { setListAdapter(new CustomAdapter(this)); } class CustomAdapter extends BaseAdapter { private Context context; public int pos; public CustomAdapter(Context context) { this.context = context; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return list.size(); } class ViewHolder { TextView userName; TextView userDesc; ImageView userImage; Button userButton; int position; ViewHolder(View view) { userImage = (ImageView)view.findViewById(R.id.imageview); userName = (TextView)view.findViewById(R.id.title); userDesc = (TextView)view.findViewById(R.id.mutualTitle); userButton = (Button)view.findViewById(R.id.btn); } } ViewHolder holder; View row; ViewGroup parent; int position; @Override public View getView(final int position, View convertView, ViewGroup parent) { row = convertView; this.parent = parent; this.pos = position; if(row == null) { // If it is visible to the user, deploy the row(s) - allocated in local memory LayoutInflater inflater = (LayoutInflater)context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); row = inflater.inflate(R.layout.search_list_item, parent, false); holder = new ViewHolder(row); row.setTag(holder); Log.d("VIRTU", "Row deployed..."); } else { // Recycle the row if it is not visible to to the user - store in local memory holder = (ViewHolder)row.getTag(); Log.d("VIRTU", "Row recycled..."); } final Friend temp = list.get(position); // Set the resources for each component in the list holder.userImage.setImageResource(temp.getImage()); holder.userName.setText(temp.getName()); holder.userDesc.setText(temp.getDesc()); holder.userButton.setTag(position); holder.userButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String text = (String)searchField.getText().toString(); searchField.setText(""); Integer index = (Integer)v.getTag(); Toast.makeText(context, index.intValue() + "..." + temp.getId(), Toast.LENGTH_SHORT).show(); try { destroy(list, names, descr, images, temp.getId()); } catch(IndexOutOfBoundsException e) { destroy(list, names, descr, images, index.intValue()); } adapter = new CustomAdapter(context); lv.setAdapter(adapter); adapter.notifyDataSetChanged(); searchField.setText(text); searchField.setSelection(searchField.getText().length()); } }); return row; } public void destroy(ArrayList<Friend> list, ArrayList<String> names, ArrayList<String> desc, ArrayList<Integer> images, int position) { list.remove(position); names.remove(position); desc.remove(position); images.remove(position); } } }