RecyclerView多布局 下拉头部放大

public class GroupTopicRecyclerView extends RecyclerView {
    private static final String TAG = "MyRecyclerView";
    private LinearLayoutManager mLayoutManager;
    private int mTouchSlop;
    private View zoomView;
    // 记录首次按下位置
    private float mFirstPosition = 0;
    // 是否正在放大
    private Boolean mScaling = false;

    LinearLayoutManager mLinearLayoutManager;
    private int screenWidth;

    public GroupTopicRecyclerView(Context context) {
        this(context, null);
    }

    public GroupTopicRecyclerView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public GroupTopicRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mLayoutManager = new LinearLayoutManager(context);
        setLayoutManager(mLayoutManager);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    public void setZoomView(View v, LinearLayoutManager linearLayoutManager) {
        //TODO获取屏幕宽度
        DisplayMetrics metrics = new DisplayMetrics();
        ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
        screenWidth = metrics.widthPixels;
       // System.out.println("宽度是 =  " + screenWidth);

        //此处我的图片命名为img,大家根据实际情况修改
        SimpleDraweeView img = v.findViewById(R.id.details_one_titleimg);
        RelativeLayout re = v.findViewById(R.id.details_one_background);
        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) img.getLayoutParams();
        //获取屏幕宽度
        lp.width = screenWidth;

        //设置宽高比为16:9
        lp.height = screenWidth * 14 / 25;
        //给imageView重新设置宽高属性
        img.setLayoutParams(lp);
        re.setLayoutParams(lp);
        this.zoomView = img;
        mLinearLayoutManager = linearLayoutManager;

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (zoomView != null) {
            RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) zoomView.getLayoutParams();
            //判断触摸事件
            switch (event.getAction()) {
                //触摸结束
                case MotionEvent.ACTION_UP:
                    mScaling = false;
                    replyImage();
                    break;
                //触摸中
                case MotionEvent.ACTION_MOVE:
                    //判断是否正在放大 mScaling 的默认值为false
                    if (!mScaling) {
                        //当图片也就是第一个item完全可见的时候,记录触摸屏幕的位置
                        if (mLinearLayoutManager.findViewByPosition(mLinearLayoutManager.findFirstVisibleItemPosition()).getTop() == 0) {
                            //记录首次按下位置
                            mFirstPosition = event.getY();
                        } else {
                            break;
                        }
                    }
                    // 滚动距离乘以一个系数
                    int distance = (int) ((event.getY() - mFirstPosition) * 0.4);
                    if (distance < 0) {
                        break;
                    }
                    // 处理放大
                    mScaling = true;

                    //----------lp.width = zoomView.getWidth() + distance;
                    lp.height = (zoomView.getWidth() + distance) * 14 / 25;
                    //System.out.println("宽度是 =  " + lp.width + "高度是" + lp.height);
                    // 设置控件水平居中(如果不设置,图片的放大缩小是从图片顶点开始)
                    ((MarginLayoutParams) lp).setMargins(-(lp.width - screenWidth) / 2, 0, 0, 0);
                    zoomView.setLayoutParams(lp);
                    return true; // 返回true表示已经完成触摸事件,不再处理
            }
        }

        return super.onTouchEvent(event);
    }


    /**
     * 图片回弹动画
     */
    private void replyImage() {
        final RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) zoomView.getLayoutParams();
        final float wPresent = zoomView.getLayoutParams().width;// 图片当前宽度
        final float hPresent = zoomView.getLayoutParams().height;// 图片当前高度

        final float width = screenWidth;// 图片原宽度
        final float heigh = screenWidth * 14 / 25;// 图片原高度

        // 设置动画
        ValueAnimator anim = ObjectAnimator.ofFloat(0.0F, 1.0F).setDuration(200);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float cVal = (Float) animation.getAnimatedValue();
                lp.width = (int) (wPresent - (wPresent - width) * cVal);
                lp.height = (int) (hPresent - (hPresent - heigh) * cVal);
                ((MarginLayoutParams) lp).setMargins(-(lp.width - screenWidth) / 2, 0, 0, 0);
                zoomView.setLayoutParams(lp);
            }
        });
        anim.start();

    }


}

使用方法Activity

      //创建适配器,设置布局管理器
        cardDetailsAdapter = new CardDetailsAdapter(this, list);
        linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        card_details_recy.setLayoutManager(linearLayoutManager);
//        //添加Android自带的分割线
//        card_details_recy.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
        //添加头布局
        View view = getLayoutInflater().inflate(R.layout.carddetails_item_one_layout, (ViewGroup) card_details_recy.getParent(), false);
        cardDetailsAdapter.addHeadView(view);
        card_details_recy.setAdapter(cardDetailsAdapter);
        card_details_recy.setZoomView(view , linearLayoutManager);

适配器与普通适配器一样

package com.example.liuhuan.first.function.adapter;

import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.example.liuhuan.first.R;
import com.example.liuhuan.first.function.bean.CardDetailsBean;
import com.example.liuhuan.first.function.bean.DemoItemBean;
import com.example.liuhuan.first.view.ShangshabanChangeTextSpaceView;
import com.facebook.drawee.view.SimpleDraweeView;

import java.text.DecimalFormat;
import java.util.List;

/**
 * 卡片详情适配器
 */
public class CardDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private int ITEMONE = 0;//头部布局
    private int ITEMTWO = 1;//条目布局
    public static final  int MSG_MEMBER = 1;//成员
    public static final  int MSG_JOIN = 2;//加入
    public static final  int MSG_TOPIC_ITEM = 3;//话题

    private Context context;
    private List<DemoItemBean> list;
    private CardCallBack cardCallBack;
    private View headView;

    public CardDetailsAdapter(Context context, List<DemoItemBean> list) {
        this.context = context;
        this.list = list;
    }

    public interface CardCallBack {
        void onCardCallBack(Message msg);
    }

    public void addHeadView(View headView) {
        this.headView = headView;
    }

    public void setCardCallBack(CardCallBack cardCallBack) {
        this.cardCallBack = cardCallBack;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        if (viewType == ITEMONE) {//条目一
            //View view = View.inflate(context, R.layout.carddetails_item_one_layout, null);
            return new DetailsOneHolder(headView);
        } else if (viewType == ITEMTWO) {//条目二
            View view = View.inflate(context, R.layout.carddetails_item_two_item, null);
            return new CardDetailsItemHolder(view);
        }
        return null;

    }

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder myHolder, final int position) {
        if (myHolder instanceof DetailsOneHolder) {
            String data = (String) list.get(position).getData();
            DetailsOneHolder myHolderOne = (DetailsOneHolder) myHolder;
            //绑定数据
            myHolderOne.details_one_people.setText("9999个成员");
            myHolderOne.details_one_title.setText(data);
            myHolderOne.details_one_title.setSpacing(50);
            myHolderOne.details_one_text.setText("谁没点烦心事,说出来大家哄哄你");
            myHolderOne.details_one_titleimg.setImageURI("https://img-blog.csdnimg.cn/20181225095119964.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NzZG5uZXdz,size_16,color_FFFFFF,t_70");
            myHolderOne.details_one_join.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Message obtain = Message.obtain();
                    obtain.what = MSG_JOIN;

                    cardCallBack.onCardCallBack(obtain);
                }
            });
            myHolderOne.details_one_people.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Message obtain = Message.obtain();
                    obtain.what = MSG_MEMBER;

                    cardCallBack.onCardCallBack(obtain);
                }
            });

        } else if (myHolder instanceof CardDetailsItemHolder) {  //设置其他不同条目
            CardDetailsItemHolder myHolderTwo = (CardDetailsItemHolder) myHolder;
            CardDetailsBean cardDetailsDataBean = (CardDetailsBean) list.get(position).getData();
            //绑定数据
            myHolderTwo.details_two_item_detailsText.setText(cardDetailsDataBean.getDetailsText());
            myHolderTwo.details_two_item_time.setText(position + "分钟前");
            myHolderTwo.details_two_item_who.setText(cardDetailsDataBean.getWho());
            myHolderTwo.details_two_item_detailsimg.setImageURI(Uri.parse("http://h.hiphotos.baidu.com/zhidao/pic/item/2f738bd4b31c87018e126740237f9e2f0608fff4.jpg"));
            myHolderTwo.details_two_item_titleimg.setImageURI(Uri.parse("http://h.hiphotos.baidu.com/zhidao/pic/item/2f738bd4b31c87018e126740237f9e2f0608fff4.jpg"));

            //根据热度动态替换背景图片
            if (cardDetailsDataBean.getHot()<20){
                myHolderTwo.details_two_item_hot.setText(cardDetailsDataBean.getHot() + "");
                myHolderTwo.details_two_item_hot.setBackground(context.getResources().getDrawable(R.drawable.comment_low));
            }else if (cardDetailsDataBean.getHot()>=20 && cardDetailsDataBean.getHot()<1000){
                myHolderTwo.details_two_item_hot.setText(cardDetailsDataBean.getHot() + "");
                myHolderTwo.details_two_item_hot.setBackground(context.getResources().getDrawable(R.drawable.comment_hot_middle));
            }else if (cardDetailsDataBean.getHot()>=1000 && cardDetailsDataBean.getHot()<10000){
                float hotNums =cardDetailsDataBean.getHot()/1000f;
                DecimalFormat df = new DecimalFormat("#.0");//格式化小数
                myHolderTwo.details_two_item_hot.setText(df.format(hotNums) + "k");
                myHolderTwo.details_two_item_hot.setBackground(context.getResources().getDrawable(R.drawable.comment_hot_high));

            }else if (cardDetailsDataBean.getHot()>=10000 && cardDetailsDataBean.getHot()<100000){
                float hotNums =cardDetailsDataBean.getHot()/10000f;
                DecimalFormat df = new DecimalFormat("#.0");//格式化小数
                myHolderTwo.details_two_item_hot.setText(df.format(hotNums) + "w");
                myHolderTwo.details_two_item_hot.setBackground(context.getResources().getDrawable(R.drawable.comment_hot_high));

            }
            if (position % 2 == 0) {
                myHolderTwo.details_two_item_detailsimg.setVisibility(View.VISIBLE);
            } else {
                myHolderTwo.details_two_item_detailsimg.setVisibility(View.GONE);
            }
            myHolderTwo.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Message obtain = Message.obtain();
                    obtain.what = MSG_TOPIC_ITEM;

                    cardCallBack.onCardCallBack(obtain);
                }
            });
        }

    }

    @Override
    public int getItemCount() {
        return list == null ? 0 : list.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (list.get(position).getItemType() == DemoItemBean.TYPE_DETAILS_TITLE) {
            return ITEMONE;
        } else if (list.get(position).getItemType() == DemoItemBean.TYPE_DETAILS_ITEM) {
            return ITEMTWO;
        }
        return -1;
    }


    class DetailsOneHolder extends RecyclerView.ViewHolder {

        private final RelativeLayout details_one_background;
        private final ShangshabanChangeTextSpaceView details_one_title;
        private final TextView details_one_people;
        private final TextView details_one_text;
        private final Button details_one_join;
        private final SimpleDraweeView details_one_titleimg;

        public DetailsOneHolder(@NonNull View itemView) {
            super(itemView);
            details_one_background = itemView.findViewById(R.id.details_one_background);
            details_one_title = itemView.findViewById(R.id.details_one_title);
            details_one_people = itemView.findViewById(R.id.details_one_people);
            details_one_text = itemView.findViewById(R.id.details_one_text);
            details_one_join = itemView.findViewById(R.id.details_one_join);
            details_one_titleimg = itemView.findViewById(R.id.details_one_titleimg);
        }
    }


    class CardDetailsItemHolder extends RecyclerView.ViewHolder {

        private final TextView details_two_item_hot;
        private final TextView details_two_item_detailsText;
        private final TextView details_two_item_who;
        private final TextView details_two_item_time;
        private final SimpleDraweeView details_two_item_titleimg;
        private final SimpleDraweeView details_two_item_detailsimg;

        public CardDetailsItemHolder(@NonNull View itemView) {
            super(itemView);
            details_two_item_hot = itemView.findViewById(R.id.details_two_item_hot);
            details_two_item_detailsText = itemView.findViewById(R.id.details_two_item_detailsText);
            details_two_item_titleimg = itemView.findViewById(R.id.details_two_item_titleimg);
            details_two_item_who = itemView.findViewById(R.id.details_two_item_who);
            details_two_item_time = itemView.findViewById(R.id.details_two_item_time);
            details_two_item_detailsimg = itemView.findViewById(R.id.details_two_item_detailsimg);
        }
    }
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个使用 Kotlin 和 RecyclerView 实现多布局的例子,同使用 Retrofit 进行网络请求: 1. 首先,你需要在项目中添加以下依赖项(在 build.gradle 文件中): ```gradle dependencies { // RecyclerView implementation 'androidx.recyclerview:recyclerview:1.2.1' // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' } ``` 2. 创建一个数据类,用于保存从网络请求中返回的数据: ```kotlin data class Item( val id: Int, val title: String, val content: String, val type: Int ) ``` 3. 创建一个接口,用于定义网络请求: ```kotlin interface ApiService { @GET("items") suspend fun getItems(): List<Item> } ``` 4. 创建一个 RecyclerView.Adapter,用于显示多种布局: ```kotlin class ItemAdapter(private val items: List<Item>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { companion object { const val TYPE_ONE = 1 const val TYPE_TWO = 2 } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { TYPE_ONE -> { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_type_one, parent, false) TypeOneViewHolder(view) } TYPE_TWO -> { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_type_two, parent, false) TypeTwoViewHolder(view) } else -> throw IllegalArgumentException("Invalid view type") } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is TypeOneViewHolder -> { holder.bind(items[position]) } is TypeTwoViewHolder -> { holder.bind(items[position]) } } } override fun getItemViewType(position: Int): Int { return items[position].type } override fun getItemCount(): Int { return items.size } class TypeOneViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(item: Item) { // 绑定 Type One 视图的数据 } } class TypeTwoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(item: Item) { // 绑定 Type Two 视图的数据 } } } ``` 5. 在 Activity 或 Fragment 中使用 RecyclerView 和 Retrofit 进行网络请求: ```kotlin class MainActivity : AppCompatActivity() { private lateinit var recyclerView: RecyclerView private lateinit var itemAdapter: ItemAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView = findViewById(R.id.recycler_view) val apiService = Retrofit.Builder() .baseUrl("https://example.com/api/") .addConverterFactory(GsonConverterFactory.create()) .build() .create(ApiService::class.java) GlobalScope.launch(Dispatchers.Main) { try { val items = apiService.getItems() itemAdapter = ItemAdapter(items) recyclerView.adapter = itemAdapter } catch (e: Exception) { Toast.makeText(this@MainActivity, "Error: ${e.message}", Toast.LENGTH_SHORT).show() } } } } ``` 在这个例子中,我们使用了两种不同的布局:`item_type_one` 和 `item_type_two`,分别对应 Item 类型为 1 和 2。你可以通过修改布局文件和 Item 类型来添加更多的布局

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值