昨天遇到了一个比较奇葩的问题,记录一下。
布局中是四个text,用merge包裹。没有任何问题
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="wrap_content">
<TextView
android:id="@+id/btn_right1"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:background="@drawable/gray_back_radius_background"
android:textColor="@color/black_f6"
android:textSize="13sp"
android:visibility="gone"
android:text="申请客服介入"
android:gravity="center"
android:layout_marginLeft="5dp"
android:layout_marginRight="8dp"/>
<TextView
android:id="@+id/btn_right2"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:background="@drawable/gray_back_radius_background"
android:textColor="@color/black_f6"
android:textSize="13sp"
android:text="申请取消"
android:visibility="gone"
android:gravity="center"
android:layout_marginLeft="5dp"
android:layout_marginRight="8dp"/>
<TextView
android:id="@+id/btn_right3"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:background="@drawable/green_line_radius_background"
android:textColor="@color/bg_green"
android:textSize="13sp"
android:gravity="center"
android:text="快递单号"
android:layout_marginLeft="5dp"
android:layout_marginRight="8dp"/>
<TextView
android:id="@+id/btn_right4"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:background="@drawable/green_radius_background"
android:textColor="@color/white_fe"
android:textSize="13sp"
android:gravity="center"
android:text="去评价"
android:layout_marginLeft="5dp"
android:layout_marginRight="8dp"/>
</merge>
adapter中 动态加载:
if(holder instanceof MyHolder){
MyHolder myHolder = (MyHolder) holder;
myHolder.resourceName.setText(list.get(position).getName());
myHolder.resourceType.setText(Contants.typeList[list.get(position).getType()]);
buttonLayout = (LinearLayout) mInflater.inflate(R.layout.unit_order_item_button, myHolder.llBtnLayout, true);
switch (list.get(position).getStatus()){
case Contants.RESOURCE_STATUS_RELEASE:
myHolder.resourceStatus.setText("发布中");
switch (list.get(position).getType()){
case Contants.RESOURCE_TYPE_PROJECT:
myHolder.resourceCount.setText("最多人数:"+list.get(position).getCount());
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.resourceCount.setVisibility(View.VISIBLE);
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("下架","成交明细","修改截止时间","修改人数",myHolder);
break;
}
private void setBtnLayout(String btn1Text,String btn2Text,String btn3Text,String btn4Text,MyHolder myHolder){
if (!TextUtils.isEmpty(btn1Text)){
btn_1 = myHolder.llBtnLayout.findViewById(R.id.btn_right1);
btn_1.setText(btn1Text);
btn_1.setVisibility(View.VISIBLE);
}else{
btn_1 = myHolder.llBtnLayout.findViewById(R.id.btn_right1);
btn_1.setVisibility(View.GONE);
}
if (!TextUtils.isEmpty(btn2Text)){
btn_2 = myHolder.llBtnLayout.findViewById(R.id.btn_right2);
btn_2.setText(btn2Text);
btn_2.setVisibility(View.VISIBLE);
}else{
btn_2 = myHolder.llBtnLayout.findViewById(R.id.btn_right2);
btn_2.setVisibility(View.GONE);
}
if (!TextUtils.isEmpty(btn3Text)){
btn_3 = myHolder.llBtnLayout.findViewById(R.id.btn_right3);
btn_3.setText(btn3Text);
}
if (!TextUtils.isEmpty(btn4Text)){
btn_4 = myHolder.llBtnLayout.findViewById(R.id.btn_right4);
btn_4.setText(btn4Text);
}
然后就出现了如下问题,刚进来正常,划到下面复用部分的时候,按钮开始多出来两个,然后划回去最上面的 最上面的也开始多出来两个。检察布局和代码其他地方都没有任何问题 。
想到以前解决过的一个bug,linearlayout复用去inflate的时候要removeAllViews,不然布局会混乱。之前解决的时候记得会报出异常,现在任何提示都没有。添加这一行代码:
if ( myHolder.llBtnLayout!= null) {
myHolder.llBtnLayout.removeAllViews();
}
贴出adapter全部代码,类型比较多:
package com.crea.market.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.crea.market.Contants;
import com.crea.market.R;
import com.crea.market.bean.ProjectInfo;
import java.util.ArrayList;
public class ResourceManagerAdapter extends RecyclerView.Adapter {
Context mContext;
ArrayList<ProjectInfo> list;
LayoutInflater mInflater;
LinearLayout buttonLayout;
TextView btn_4;
TextView btn_1;
TextView btn_2;
TextView btn_3;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == Contants.RESOURCE_TYPE_TEACHER){
View itemView = mInflater.inflate(R.layout.item_resource_manager_teacher, parent, false);
return new TeacherHolder(itemView);
}else {
View itemView = mInflater.inflate(R.layout.item_resource_manager, parent, false);
return new MyHolder(itemView);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof TeacherHolder){
TeacherHolder teacherHolder = (TeacherHolder) holder;
teacherHolder.resourceName.setText(list.get(position).getName());
Glide.with(mContext).load(list.get(position).getImageView()).into(teacherHolder.resourceImg);
teacherHolder.resourceType.setText("讲师");
switch (list.get(position).getStatus()){
case Contants.RESOURCE_STATUS_RELEASE:
teacherHolder.resourceStatus.setText("发布中");
buttonLayout = (LinearLayout) mInflater.inflate(R.layout.unit_order_item_button, teacherHolder.llBtnLayout, true);
btn_4 = buttonLayout.findViewById(R.id.btn_right4);
btn_4.setText("下架");
btn_3 = buttonLayout.findViewById(R.id.btn_right3);
btn_3.setText("成交明细");
break;
case Contants.RESOURCE_STATUS_AUTO_OBTAINED:
teacherHolder.resourceStatus.setText("自动下架");
break;
case Contants.RESOURCE_STATUS_TAKE_OBTAINED:
teacherHolder.resourceStatus.setText("主动下架");
buttonLayout = (LinearLayout) mInflater.inflate(R.layout.unit_order_item_button, teacherHolder.llBtnLayout, true);
btn_4 = buttonLayout.findViewById(R.id.btn_right4);
btn_4.setText("重新上架");
btn_3 = buttonLayout.findViewById(R.id.btn_right3);
btn_3.setText("成交明细");
break;
}
teacherHolder.parentLayout.setOnClickListener(view -> {
if (onItemClick != null) {
onItemClick.onItemClick(position);
}
});
}else if(holder instanceof MyHolder){
MyHolder myHolder = (MyHolder) holder;
myHolder.resourceName.setText(list.get(position).getName());
myHolder.resourceType.setText(Contants.typeList[list.get(position).getType()]);
if ( myHolder.llBtnLayout!= null) {
myHolder.llBtnLayout.removeAllViews();
}
buttonLayout = (LinearLayout) mInflater.inflate(R.layout.unit_order_item_button, myHolder.llBtnLayout, true);
switch (list.get(position).getStatus()){
case Contants.RESOURCE_STATUS_RELEASE:
myHolder.resourceStatus.setText("发布中");
switch (list.get(position).getType()){
case Contants.RESOURCE_TYPE_PROJECT:
myHolder.resourceCount.setText("最多人数:"+list.get(position).getCount());
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.resourceCount.setVisibility(View.VISIBLE);
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("下架","成交明细","修改截止时间","修改人数",myHolder);
break;
case Contants.RESOURCE_TYPE_MATERIAL:
myHolder.resourceCount.setText("套数:"+list.get(position).getCount());
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.resourceCount.setVisibility(View.VISIBLE);
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("下架","成交明细","修改截止时间","数量",myHolder);
break;
case Contants.RESOURCE_TYPE_FACILITIES:
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("下架","成交明细","修改截止时间","修改使用时间",myHolder);
break;
case Contants.RESOURCE_TYPE_COURSE:
setBtnLayout("","","下架","成交明细",myHolder);
break;
}
break;
case Contants.RESOURCE_STATUS_AUTO_OBTAINED:
myHolder.resourceStatus.setText("自动下架");
switch (list.get(position).getType()){
case Contants.RESOURCE_TYPE_PROJECT:
myHolder.resourceCount.setText("最多人数:"+list.get(position).getCount());
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.resourceCount.setVisibility(View.VISIBLE);
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("","成交明细","修改截止时间","重新上架",myHolder);
break;
case Contants.RESOURCE_TYPE_MATERIAL:
myHolder.resourceCount.setText("套数:"+list.get(position).getCount());
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.resourceCount.setVisibility(View.VISIBLE);
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("","成交明细","修改截止时间","重新上架",myHolder);
break;
case Contants.RESOURCE_TYPE_FACILITIES:
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("成交明细","修改截止时间","修改截止时间","重新上架",myHolder);
break;
}
break;
case Contants.RESOURCE_STATUS_TAKE_OBTAINED:
myHolder.resourceStatus.setText("主动下架");
switch (list.get(position).getType()){
case Contants.RESOURCE_TYPE_PROJECT:
myHolder.resourceCount.setText("最多人数:"+list.get(position).getCount());
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.resourceCount.setVisibility(View.VISIBLE);
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("","成交明细","修改截止时间","重新上架",myHolder);
break;
case Contants.RESOURCE_TYPE_MATERIAL:
myHolder.resourceCount.setText("套数:"+list.get(position).getCount());
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.resourceCount.setVisibility(View.VISIBLE);
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("","成交明细","修改截止时间","重新上架",myHolder);
break;
case Contants.RESOURCE_TYPE_FACILITIES:
myHolder.cutoffTime.setText("截止洽谈时间:"+list.get(position).getOverTime());
myHolder.cutoffTime.setVisibility(View.VISIBLE);
setBtnLayout("成交明细","修改截止时间","修改使用时间","重新上架",myHolder);
break;
case Contants.RESOURCE_TYPE_COURSE:
setBtnLayout("","成交明细","修改截止时间","重新上架",myHolder);
break;
}
break;
}
Glide.with(mContext).load(list.get(position).getImageView()).into(myHolder.resourceImg);
myHolder.parentLayout.setOnClickListener(view -> {
if (onItemClick != null) {
onItemClick.onItemClick(position);
}
});
}
}
private void setBtnLayout(String btn1Text,String btn2Text,String btn3Text,String btn4Text,MyHolder myHolder){
if (!TextUtils.isEmpty(btn1Text)){
btn_1 = myHolder.llBtnLayout.findViewById(R.id.btn_right1);
btn_1.setText(btn1Text);
btn_1.setVisibility(View.VISIBLE);
}else{
btn_1 = myHolder.llBtnLayout.findViewById(R.id.btn_right1);
btn_1.setVisibility(View.GONE);
}
if (!TextUtils.isEmpty(btn2Text)){
btn_2 = myHolder.llBtnLayout.findViewById(R.id.btn_right2);
btn_2.setText(btn2Text);
btn_2.setVisibility(View.VISIBLE);
}else{
btn_2 = myHolder.llBtnLayout.findViewById(R.id.btn_right2);
btn_2.setVisibility(View.GONE);
}
if (!TextUtils.isEmpty(btn3Text)){
btn_3 = myHolder.llBtnLayout.findViewById(R.id.btn_right3);
btn_3.setText(btn3Text);
}
if (!TextUtils.isEmpty(btn4Text)){
btn_4 = myHolder.llBtnLayout.findViewById(R.id.btn_right4);
btn_4.setText(btn4Text);
}
}
public ResourceManagerAdapter(Context context, ArrayList<ProjectInfo> list) {
this.mContext = context;
this.list = list;
mInflater = LayoutInflater.from(context);
}
@Override
public int getItemCount() {
return list.size();
}
class MyHolder extends RecyclerView.ViewHolder {
public TextView resourceName;
public ImageView resourceImg;
public TextView resourceType;
public TextView cutoffTime;
public TextView resourceStatus;
public TextView resourceCount;
public LinearLayout llBtnLayout;
public RelativeLayout parentLayout;
public MyHolder(View itemView) {
super(itemView);
parentLayout = (RelativeLayout) itemView;
resourceName = itemView.findViewById(R.id.tv_my_order_name);
resourceImg =itemView.findViewById(R.id.iv_order_image);
resourceType = itemView.findViewById(R.id.tv_my_order_type);
resourceCount = itemView.findViewById(R.id.tv_people_count);
resourceStatus = itemView.findViewById(R.id.tv_resource_status);
llBtnLayout = itemView.findViewById(R.id.ll_button_layout);
cutoffTime = itemView.findViewById(R.id.tv_resource_cutoff_time);
}
}
class TeacherHolder extends RecyclerView.ViewHolder {
public TextView resourceName;
public ImageView resourceImg;
public TextView resourceType;
public TextView resourceStatus;
public LinearLayout llBtnLayout;
public RelativeLayout parentLayout;
public TeacherHolder(View itemView) {
super(itemView);
parentLayout = (RelativeLayout) itemView;
resourceName = itemView.findViewById(R.id.tv_my_order_name);
resourceImg =itemView.findViewById(R.id.iv_order_image);
resourceType = itemView.findViewById(R.id.tv_my_order_type);
resourceStatus = itemView.findViewById(R.id.tv_resource_status);
llBtnLayout = itemView.findViewById(R.id.ll_button_layout);
}
}
public interface OnItemClick {
void onItemClick(int position);
}
@Override
public int getItemViewType(int position) {
return list.get(position).getType();
}
private OnItemClick onItemClick;
public void setOnItemClick(OnItemClick onItemClick) {
this.onItemClick = onItemClick;
}
}