【问题标题】:Big space between items in Android RecyclerViewAndroid RecyclerView 中项目之间的大空间
【发布时间】:2017-08-29 20:41:37
【问题描述】:

我正在使用 RecyclerView 从每次在 EditText 中按“Enter”时填充的对象列表中加载数据。但我面临的问题是我添加的第一个项目显示正常,当我添加第二个项目时,它显示第一个和第二个之间的差距很大,如果我继续添加项目,差距会变得更大并且列表没有' t 适合整个屏幕。

这是我的适配器:

public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.MyViewHolder> {

    private Context mContext;
    private List<Category> categoryList;
    private Category category;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title, count;
        public EditText nameCategory;

        public MyViewHolder(View view) {
            super(view);
            nameCategory = (EditText) view.findViewById(R.id.edittext_category);
            //overflow = (ImageView) view.findViewById(R.id.overflow);
        }
    }


    public CategoryAdapter(Context mContext, List<Category> categoryList) {
        this.mContext = mContext;
        this.categoryList = categoryList;
    }

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

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final CategoryAdapter.MyViewHolder holder, final int position) {
        category = categoryList.get(position);
        holder.nameCategory.setText(category.getCategory_name());
    }


    @Override
    public int getItemCount() {
        return categoryList.size();
    }
}

这是适配器的 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_below="@+id/toolbar"
        android:id="@+id/add_category_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/minus_red"
            android:paddingTop="20dp"
            android:paddingLeft="20dp"
            android:paddingRight="20dp"
            android:paddingBottom="20dp"/>

        <EditText
            android:id="@+id/edittext_category"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="@string/add_new_category"
            android:textColorHint="#b1b1b1"
            android:textColor="@color/text_color"
            android:textSize="@dimen/s_text_size"
            android:paddingTop="20dp"
            android:background="#ffffff"
            android:maxLines="1"/>
    </LinearLayout>

</LinearLayout>

这是我的 Activity 中 RecyclerView 的 XML 代码:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    android:scrollbars="vertical"
    android:visibility="invisible"
    android:layout_below="@id/layout_bar"/>

这就是我的 Activity 中 recyclerView 的定义方式:

recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

我也使用此代码将其填充到我的 Activity 中:

edit_category.setOnKeyListener(new OnKeyListener() {
                            public boolean onKey(View v, int keyCode, KeyEvent event) {
                                // If the event is a key-down event on the "enter" button
                                if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                                        (keyCode == KeyEvent.KEYCODE_ENTER)) {

                                    System.out.println("Entrou");
                                    Category category = new Category();
                                    category.setCategory_name(edit_category.getText().toString());
                                    categoriesList.add(category);
                                    adapter = new CategoryAdapter(getApplicationContext(), categoriesList);
                                    recyclerView.setAdapter(adapter);
                                    recyclerView.setVisibility(View.VISIBLE);
                                    edit_category.setText("");



                                    // hide virtual keyboard
                                    InputMethodManager imm =
                                            (InputMethodManager)getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                                    imm.hideSoftInputFromWindow(edit_category.getWindowToken(), 0);
                                    return true;
                                }
                                return false;
                            }
                        });

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    您的适配器正在使用layout_height="match_parent" 填充行,这意味着每行的高度将对应于RecyclerView 的完整高度。也许您想改用wrap_content

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="wrap_content">
        ...
    

    【讨论】:

    • 非常感谢!我不知道这个,它起作用了。
    【解决方案2】:

    只需在自定义布局的列表行的父布局中添加 android:layout_margin 属性

    【讨论】:

      【解决方案3】:

      Recyclerview内,改变换行内容的高度:

      <androidx.recyclerview.widget.RecyclerView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
      </androidx.recyclerview.widget.RecyclerView>
      

      【讨论】: