如何让视图不占用任何空间但仍然可以在Android RecyclerView中看到?

时间:2017-08-14 07:26:56

标签: android android-recyclerview

我有一个RecyclerView和两种类型的视图(标题和项目 - >这些是相同的类对象,但包含不同的数据)。我希望标题可见,但它不应占用空间(类似于FrameLayout)。标题下方的项目应该在此标题上绘制(在其位置,但两者都应该可见)。 项目的工作方式与LinearLayout类似。

Example image

我正在考虑编写自己的自定义LayoutManager。这是一个好主意,还是有更好的解决方案来解决我的问题?你能指点我吗?最终我应该如何编写这个LayoutManager?

我忘了提到我不能使用任何外部库。我必须自己做。

3 个答案:

答案 0 :(得分:0)

0.353π

rootView.setVisibility(View.INVISIBLE);方法中,对项目的根元素使用onBind()

答案 1 :(得分:0)

  1. 每个itemView都包含一个headerView,但只有第一个itemView的headerView可见,而其他项目则不可见。

    当你在每个itemView上添加一个无用的视图时,它很容易实现,这对性能不利。

  2. 由于您使用的是RecyclerView,而不是ListView。我推荐了RecyclerView.ItemDecoration。

答案 2 :(得分:0)

在给出答案之前,请先查看定义

<强> VIEW.INVISIBLE:

  

此视图不可见,但仍会占用布局空间。

<强> VIEW.GONE:

  

此视图不可见,并且不需要任何空间用于布局。

为了更好地理解,请查看此屏幕截图https://stackoverflow.com/a/23211042/4741746

现在来到这一点你不需要两种类型的视图只需要一种类型的视图就足够了解项目视图。你需要的是在你的适配器中为你的服装适配器创建左侧标题的视图和右侧的项目,让我们将其视为 row_layout.xml

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

    <TextView
        android:id="@+id/tv_receipt_label"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:padding="3dp"
        android:text="Header"
        android:textSize="@dimen/title_text_font_size" />

    <TextView
        android:id="@+id/tv_receipt_value"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:gravity="end"
        android:padding="3dp"
        android:text="item"
        android:textSize="@dimen/title_text_font_size" />

</LinearLayout>   

DataAdpater.java文件就像

class DataAdapter extends BaseAdapter {
        ArrayList<UserReadOnlyData> receiptFields;
        Context context;
        public DataAdapter(Context context, ArrayList<UserReadOnlyData> receiptFields) {
            this.receiptFields = receiptFields;
            this.context = context;
        }
        @Override
        public int getCount() {
            return this.receiptFields.size();
        }
        @Override
        public UserReadOnlyData getItem(int position) {
            return receiptFields.get(position);
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
        @SuppressLint({ "ViewHolder", "InflateParams" })
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater receiptRowViewInflator = LayoutInflater
                    .from(context);
            convertView = receiptRowViewInflator.inflate(
                    R.layout.row_layout, null);
            TextView header = (TextView) convertView
                    .findViewById(R.id.tv_receipt_label);
            TextView item = (TextView) convertView
                    .findViewById(R.id.tv_receipt_value);
            UserReadOnlyData receiptConfig = receiptFields.get(position);

            if(null!=receiptConfig.header&&receiptConfig.header.length()>0){
                header.setText((null!=receiptConfig.header)?receiptConfig.header :"");
            }else {
                header.setVisibility(View.VISIBLE);
            }
            item.setText((null!=receiptConfig.item)?receiptConfig.item :"");

            return convertView;
        }

    }
public class UserReadOnlyData{
    String header;
    String item;
    public UserReadOnlyData(String lable,String value){
        this.header =lable;
        this.item =value;
    }
}

比设置你的版权

    ArrayList<UserReadOnlyData> receiptFields= getYourValues();
    DataAdapter adapter = new DataAdapter (mContext, receiptFields);
    listView.setAdapter(adapter);