java - CardView在RecyclerView中突然出现空白

标签 java android android-recyclerview adapter

RecyclerView 中的我的 CardView 看起来与此格式类似

  • original

现在它已经间隔开

  • problem spacing

事情发生在一周前。我以为我放错了一行代码。不知道我做了什么。我以为这是一个小错误,我最终会发现......

前一刻,适配器还好,但下一刻,一切都错乱了。我查看了本地历史等,但找不到我做了什么。

如果不是很小,怀疑我的项目中的 RecyclerView 库不知何故搞砸了,因为我在不同区域使用的另一个适配器也存在间距问题。然而,我从未去过那里附近的任何地方。

但是,我从网上的另一个项目复制粘贴了另一个 RecyclerView 适配器,它在我的项目中运行良好,所以我相信我在找不到的地方犯了错误。 更新 3/22 我设法找到了在这一切出现之前所做的备份。我将“坏”代码复制并粘贴到未受污染的备份中,适配器看起来就像它应该的那样。然而,它并不像原著中那样出现。

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;
    }


}

最佳答案

我找到了解决方案。我将卡片 View 所在的所有 android:layout_width 和 android:layout_height 更改为“wrap_content”而不是“match_parent)

感谢 RecyclerView v23.2.0 and blank space after swiping up

尽管如此,它并不能解释为什么我的代码在导出到其他项目时工作正常。

关于java - CardView在RecyclerView中突然出现空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368913/

相关文章:

android - 如何签署我已经制作的 android app/.apk 文件

android - 在闹钟接收器android上设置通知

java - 我应该避免在 Spring util 包中使用类吗?

java - 使用 Intent 打开 Assets 文件夹中的文件

android - RxJava2 相对于 AsyncTask 的优势

android - RecyclerView 会回收 NestedScrollView 中的项目吗?

android - 更新以支持库 23.2.1 后,RecyclerView 项目底部有非常大的空白空间

java - 在 mvvm 中将 recyclerview 向下滚动到底部

java - 如何使用 SQLite 直接访问文件中的特定记录?在 LibGDX 中

java - 无法使用 IdeEventQueue 错误构建应用程序