1

My CardView in a RecyclerView looked similar to this format

  • original

now it is spaced out

  • problem spacing

It happened a week ago. I thought I had misplaced a line of code. have no idea what I did. I thought it was a small mistake I would eventually find....

One moment, the adapter was fine, then the next moment, it is all spaced out. I've looked at local history, etc. I cannot find what I did.

If it isn't anything small, have a suspicion that somehow the RecyclerView library in my project is messed up somehow, because another adapter I was using in a different area also has the spacing problem. However, I never went any where near there.

However, I have copy-pasted another RecyclerView adapter from a different project online and it ran fine in mine, so I believe I made a mistake somewhere I cannot find. UPDATE 3/22 I managed to find a backup I did before all this came up. I copy and pasted the "bad" code into the untainted backup and the adapter came out looking like it is supposed to be. Yet, it is not appearing like that in the original.

CustomAdapter.java

    // Dataset = list of players and their attributes
private final ArrayList<PlayerData> dataSet;
private final List<PlayerData> filteredList;
private ArrayList<PlayerData> originalItems;
public static class MyViewHolder extends RecyclerView.ViewHolder {

    TextView textViewName;
    TextView textViewPos;
    ImageView imageViewFace;
    ImageView imageTeamLogo;
    TextView textViewTeam;

    public MyViewHolder(View itemView) {
        super(itemView);
        this.textViewName = (TextView) itemView.findViewById(R.id.textViewName);
        this.textViewPos = (TextView) itemView.findViewById(R.id.textViewPos);
        this.imageViewFace = (ImageView) itemView.findViewById(R.id.imageViewFace);
        this.imageTeamLogo = (ImageView) itemView.findViewById(R.id.ImgTeamLogo);
        this.textViewTeam = (TextView) itemView.findViewById(R.id.textViewTeam);

    }
}
//dataset = data from Main Activity
public CustomAdapter(ArrayList<PlayerData> data) {
    this.dataSet = data;
    this.filteredList = data;

}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                       int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.cards_layout, parent, false);

    MyViewHolder myViewHolder = new MyViewHolder(view);

    return myViewHolder;
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int Position) {
    // called everytime user scrolls up or down
    TextView textViewName = holder.textViewName;
    TextView textViewPos = holder.textViewPos;
    ImageView imageViewFace = holder.imageViewFace;
    ImageView imageViewLogo = holder.imageTeamLogo;
    TextView textViewTeam = holder.textViewTeam;


    textViewName.setText(dataSet.get(Position).getName());

    textViewPos.setText(dataSet.get(Position).getPos());

    textViewTeam.setText(dataSet.get(Position).getTeam());




    Context context = imageViewFace.getContext();
    Context context2 = imageViewLogo.getContext();

    Picasso.with(context)
            .load(dataSet.get(Position).getFace())
            .placeholder(R.drawable.ic_launcher)
            .error(R.drawable.ic_3d_rotation)
            .into(holder.imageViewFace);

    Glide.with(context2).load(dataSet.get(Position).getTeamLogo()).into(holder.imageTeamLogo);
}

@Override
public int getItemCount() {
    return dataSet.size();
}
public void animateTo(ArrayList<PlayerData> players) {
    //checks what query found and adds / removes results
    // problem is, it is not adding back results
    applyAndAnimateRemovals(players);
    applyAndAnimateAdditions(players);
    applyAndAnimateMovedItems(players);

}

private void applyAndAnimateRemovals(ArrayList<PlayerData> newPlayers) {
    for (int i = dataSet.size() - 1; i >= 0; i--) {
        final PlayerData player = dataSet.get(i);
        if (!newPlayers.contains(player)) {
            removeItem(i);
        }
    }
}

private void applyAndAnimateAdditions(ArrayList<PlayerData> newPlayers) {
    for (int i = 0, count = newPlayers.size(); i < count; i++) {
        final PlayerData player = newPlayers.get(i);
        if (!dataSet.contains(player)) {
            addItem(i, player);
        }
    }
}


private void applyAndAnimateMovedItems(ArrayList<PlayerData> newPlayers) {
    for (int toPosition = newPlayers.size() - 1; toPosition >= 0; toPosition--) {
        final PlayerData player = newPlayers.get(toPosition);
        final int fromPosition = dataSet.indexOf(player);
        if (fromPosition >= 0 && fromPosition != toPosition) {
            moveItem(fromPosition, toPosition);
        }
    }
}

public PlayerData removeItem(int position) {
        final PlayerData player = dataSet.remove(position);
        notifyItemRemoved(position);

        return player;
    }
    public void addItem(int position, PlayerData player) {
        dataSet.add(position, player);
        // this code is not working for whatever reason)
        notifyItemInserted(position);


    }

    public void moveItem(int fromPosition, int toPosition) {
        final PlayerData player = dataSet.remove(fromPosition);
        dataSet.add(toPosition, player);
        notifyItemMoved(fromPosition, toPosition);
    }
}

MainFragment.Java

public class MainFragment extends Fragment  implements SearchView.OnQueryTextListener {
    public static MainFragment newInstance() {
        return new MainFragment();
    }

    private static RecyclerView recyclerView;
    private static CustomAdapter adapter;
    private static ArrayList<PlayerData> data;





    private RecyclerView.LayoutManager layoutManager;
    static View.OnClickListener myOnClickListener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_main, container, false);


        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);

        return view;

    }


    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        setHasOptionsMenu(true);

        recyclerView.setHasFixedSize(true);

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        data = new ArrayList<PlayerData>();


        addPlayers();
        adapter = new CustomAdapter(data);

        recyclerView.setAdapter(adapter);


    }


    public interface Constants {
        String LOG = "com.vogella.testapp";
    }
    private void addPlayers() {

        PlayerData player = new PlayerData("Chris Smith", "#", R.drawable.auser, R.drawable.aquestion, "First", 0);
        data.add(0,player);
        player = new PlayerData("Bobby Richars","#", R.drawable.auser, R.drawable.aquestion, "Second", 9);
        data.add(player);
        player = new PlayerData("Steven Williams", "#", R.drawable.auser, R.drawable.aquestion, "Third", 1);
        data.add(player);


        player = new PlayerData("Tony Lloyd", "#", R.drawable.auser, R.drawable.aquestion, "Fourth", 2);
        data.add(player);

        player = new PlayerData("Henry Gates", "#", R.drawable.auser,R.drawable.aquestion, "Fifth", 3);
        data.add(player);

        player = new PlayerData("Robert Marks", "#", R.drawable.auser, R.drawable.aquestion, "Sixth", 4);
        data.add(player);
    }
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_main, menu);

        final MenuItem item = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(this);

    }
    @Override
    public boolean onQueryTextChange(String query) {
        final ArrayList<PlayerData> filteredModelList = filter(data, query);
        adapter.animateTo(filteredModelList);
        recyclerView.scrollToPosition(0);
        return false;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    private ArrayList<PlayerData> filter(ArrayList<PlayerData> players, String query) {
        query = query.toLowerCase();

        final ArrayList<PlayerData> filteredModelList = new ArrayList<>();
        for (PlayerData player : players) {
            final String text = player.getName().toLowerCase() + player.getPos().toLowerCase()+ player.getTeam().toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(player);
            }
        }
        return filteredModelList;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        return true;
    }


}
Marcin Orlowski
  • 72,056
  • 11
  • 123
  • 141
CrisE4
  • 183
  • 2
  • 13

1 Answers1

0

I found a solution. I changed all my android:layout_width and android:layout_height where the cardviews were, into "wrap_content" instead of "match_parent)

thanks to RecyclerView v23.2.0 and blank space after swiping up

Although, it doesn't explain why my code works fine when exported to other projects.

Community
  • 1
  • 1
CrisE4
  • 183
  • 2
  • 13