【问题标题】:How to set different height for each items in recycler View如何在回收站视图中为每个项目设置不同的高度
【发布时间】:2018-09-24 06:34:55
【问题描述】:

我想为回收站视图中的每个项目设置不同的高度。通常我们每行都得到相同的高度。但是我需要不同的高度,例如,如果前三行的高度是 70,那么我需要剩下的高度为 0。我的代码如下。在此代码中,其设置不正确。请建议我编辑

public class MainActivity extends AppCompatActivity {

private RecyclerView rvListProfiles;
private ListProfileAdapter listProfileAdapter;
private String[] list = new String[]{"ABC","DEF","GHI","JKL","MNO"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    rvListProfiles = findViewById(R.id.rvListProfiles);

    listProfileAdapter = new ListProfileAdapter(list, this);
    RecyclerView.LayoutManager mLayoutManager = new 
    LinearLayoutManager(getApplicationContext());
    rvListProfiles.setLayoutManager(mLayoutManager);
    rvListProfiles.setItemAnimator(new DefaultItemAnimator());
    rvListProfiles.setAdapter(listProfileAdapter);
    String listString = Arrays.toString(list);
    System.out.println("List "+listString);
}
}

项目 xml

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:background="@android:color/darker_gray"
    android:padding="10dp"
    android:id="@+id/parentLayout">

<ImageView
    android:id="@+id/profileImage"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_alignParentStart="true"
    android:layout_centerVertical="true"
    android:src="@mipmap/love"
    android:transitionName="imageTransition" />

<TextView
    android:id="@+id/profileName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_marginStart="23dp"
    android:layout_toEndOf="@+id/profileImage"
    android:padding="2dp"
    android:text="TextView"
    android:textColor="@android:color/background_light"
    android:textSize="18sp"
    android:transitionName="nameTransition" />

<TextView
    android:id="@+id/profileDesc"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/profileImage"
    android:layout_alignStart="@+id/profileName"
    android:layout_marginTop="5dp"
    android:maxLines="1"
    android:padding="2dp"
    android:text="@string/dummy_data"
    android:textColor="@android:color/background_light"
    android:textSize="12sp"
    android:transitionName="descTransition" />

   </RelativeLayout>

ViewHolder 类

public class ListProfileViewHolder extends RecyclerView.ViewHolder {

public ImageView profileImage;
public TextView profileName;
public TextView profileDesc;
public RelativeLayout parentLayout;
public Context context;

public ListProfileViewHolder(View itemView, Context mContext) {
    super(itemView);
    this.context = mContext;
    profileImage = itemView.findViewById(R.id.profileImage);
    profileName = itemView.findViewById(R.id.profileName);
    profileDesc = itemView.findViewById(R.id.profileDesc);
    parentLayout = itemView.findViewById(R.id.parentLayout);
}

}

适配器类

public class ListProfileAdapter extends 
RecyclerView.Adapter<ListProfileViewHolder> {

private String[] list;
private Context mContext;
private int height[] = {70,70,70,
                        0,0,0,0};

public ListProfileAdapter(String[] list, Context mContext) {
    this.list = list;
    this.mContext = mContext;
}

@Override
public ListProfileViewHolder onCreateViewHolder(ViewGroup parent, int 
viewType) {
    View layoutView = 
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, 
null);
    return new ListProfileViewHolder(layoutView, mContext);
}

@Override
public void onBindViewHolder(final ListProfileViewHolder holder, int 
position) {


    holder.parentLayout.setLayoutParams(new 
RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            height[position]));
    holder.profileName.setText(list[position]);
    holder.profileImage.setOnClickListener(new View.OnClickListener() 
{
     @Override
     public void onClick(View view) {
         Intent sharedIntent = new 
Intent(mContext,SharedActivity.class);
         sharedIntent.putExtra("name",holder.profileName.getText());
         sharedIntent.putExtra("desc",holder.profileDesc.getText());
         Pair[] pairs = new Pair[3];
         pairs[0] = new Pair<View,String> 
(holder.profileImage,"imageTransition");
         pairs[1] = new Pair<View,String> 
(holder.profileName,"nameTransition");
         pairs[2] = new Pair<View,String> 
(holder.profileDesc,"descTransition");

         ActivityOptions options = 
ActivityOptions.makeSceneTransitionAnimation((Activity) 
mContext,pairs);
         mContext.startActivity(sharedIntent,options.toBundle());
     }
 });
    holder.parentLayout.setOnClickListener(new View.OnClickListener() 
{
        @Override
        public void onClick(View view) {
            height = new int[]{0,0,0,
                    70,70,70,70,};
            notifyDataSetChanged();
        }
    });
}

@Override
public int getItemCount() {
    return list.length;
}
}

【问题讨论】:

标签: android android-recyclerview


【解决方案1】:

试试这样。

holder.parentLayout.requestLayout();
            if (position == 0 || position==1 || position==2) {
                holder.parentLayout.getLayoutParams().height = height[position];
            } else {
                holder.parentLayout.getLayoutParams().height = height[position];
            }

【讨论】:

  • 我们无法将其与位置进行比较,因为在下一步中,当我们单击一个项目时,我们需要更改每个高度。
  • 您在 if 和 else 中添加了相同的行。那么If条件有什么用呢?
【解决方案2】:

在我的例子中,我向 FlowLayout 添加了视图,但项目的高度都相同。

解决方案: 在item layout xml中,只使用RelativeLayout作为root,并确保动态添加子视图的布局也被RelativeLayout包围。

就像这样:

<RelativeLayout>
  ...
  <FlowLayout />

</RelativeLayout>

【讨论】:

    【解决方案3】:

    .xml 中的高度以 dp(70dp) 为单位,而在编码中以像素为单位。 因此,要正确获取尺寸,您需要将 dp 转换为 px,然后以编程方式应用它:

    将dp转换为px:

    public int DpToPx(Activity activity, int dp){
        Resources r  = activity.getResources();
        int px    = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics());
        return px;
    
    }
    

    然后应用到您的布局参数:

    holder.parentLayout.setLayoutParams(newRelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            DPToPx(activity, height[position]));
    

    【讨论】:

    • 让我检查一下先生
    • 先生,我们如何在适配器中使用它,因为在适配器活动中无法访问
    • 在你的适配器构造函数中设置它: public ListProfileAdapter(String[] list, Context mContext, Activity activity) { this.list = list; this.mContext = mContext; this.activity = 活动; }
    • 这里你给了我解决方案。你节省了我的时间。非常感谢先生。
    【解决方案4】:

    您可以尝试将 StaggeredGridLayoutManager 用于不对称项目。

    尝试改变这个

    RecyclerView.LayoutManager mLayoutManager = new 
        LinearLayoutManager(getApplicationContext());
    

    到这里

    RecyclerView.LayoutManager mLayoutManager = new 
        StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
    

    一些例子:

    1: Staggered GridView

    2: StaggeredGridLayout

    【讨论】:

      【解决方案5】:

      由于要更新Layout size,需要刷新UI,layout size更新后尝试调用此行:

      holder.parentLayout.requestLayout(); //It is necesary to refresh the screen

      【讨论】:

      • 让我看看先生。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2014-09-24
      相关资源
      最近更新 更多