recycleview实现多种布局及点击事件
来源:互联网 发布:高斯分布和协方差矩阵 编辑:程序博客网 时间:2024/05/16 17:39
1.导入design包
2.MainActivitiy类,FullLinearlayoutManager类,Adapter
3.layout里面的布局
package com.example.recycleview;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.Toast;import java.util.ArrayList;import java.util.List; /* * recycleview实现分布式布局 * 此处以三种不同的list实现三种不同的布局 * Created by y.vn on 2016/12/21. */public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private List<String> firstList = new ArrayList<>(); private List<String> secondList = new ArrayList<>(); private List<String> thirdList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recycleview); //控制recycleview高度自适应 recyclerView.setLayoutManager(new FullLinearLayoutManager(this)); initDate(); RecycleViewAdapter recycleViewAdapter = new RecycleViewAdapter(this, firstList, secondList, thirdList); recyclerView.setAdapter(recycleViewAdapter); //adapter的点击事件 recycleViewAdapter.setOnItemListener(new RecycleViewAdapter.OnItemListener() { @Override public void onClick(View v, int position) { Toast.makeText(MainActivity.this, position + "", Toast.LENGTH_SHORT); } }); } //初始化list数据源 private void initDate() { for (int i = 0; i < 5; i++) { firstList.add("第一种布局" + i); } for (int i = 5; i < 10; i++) { secondList.add("第二种布局" + i); } for (int i = 10; i < 16; i++) { thirdList.add("第三种布局" + i); } }}
import android.content.Context;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;/** * Created by y.vn on 2016/11/30. */public class FullLinearLayoutManager extends LinearLayoutManager { private static final String TAG = FullLinearLayoutManager.class.getSimpleName(); public FullLinearLayoutManager(Context context) { super(context); } public FullLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); } private int[] mMeasuredDimension = new int[2]; @Override public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) { final int widthMode = View.MeasureSpec.getMode(widthSpec); final int heightMode = View.MeasureSpec.getMode(heightSpec); final int widthSize = View.MeasureSpec.getSize(widthSpec); final int heightSize = View.MeasureSpec.getSize(heightSpec); int width = 0; int height = 0; for (int i = 0; i < getItemCount(); i++) { measureScrapChild(recycler, i, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED), mMeasuredDimension); if (getOrientation() == HORIZONTAL) { width = width + mMeasuredDimension[0]; if (i == 0) { height = mMeasuredDimension[1]; } } else { height = height + mMeasuredDimension[1]; if (i == 0) { width = mMeasuredDimension[0]; } } } switch (widthMode) { case View.MeasureSpec.EXACTLY: width = widthSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } switch (heightMode) { case View.MeasureSpec.EXACTLY: height = heightSize; case View.MeasureSpec.AT_MOST: case View.MeasureSpec.UNSPECIFIED: } setMeasuredDimension(width, height); } private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, int heightSpec, int[] measuredDimension) { try { View view = recycler.getViewForPosition(0);//fix 动态添加时报IndexOutOfBoundsException if (view != null) { RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec, getPaddingLeft() + getPaddingRight(), p.width); int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, getPaddingTop() + getPaddingBottom(), p.height); view.measure(childWidthSpec, childHeightSpec); measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin; measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin; recycler.recycleView(view); } } catch (Exception e) { e.printStackTrace(); } }}
布局import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.List;/** * Created by y.vn on 2016/12/21. */public class RecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<String> firstList; private List<String> secondList; private List<String> thirdList; private OnItemListener listener; public RecycleViewAdapter(Context context, List<String> firstList, List<String> secondList, List<String> thirdList) { this.context = context; this.firstList = firstList; this.secondList = secondList; this.thirdList = thirdList; } public void setOnItemListener(OnItemListener onItemListener) { this.listener = onItemListener; } public interface OnItemListener { //此处可以选择我们需要的参数例如position. void onClick(View v, int position); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder holder = null; switch (viewType) { case 0: holder = new MySignHolder1(LayoutInflater.from(context).inflate(R.layout.item_list, parent, false)); break; case 1: holder = new MySignHolder2(LayoutInflater.from(context).inflate(R.layout.item_list, parent, false)); break; case 2: holder = new MySignHolder3(LayoutInflater.from(context).inflate(R.layout.item_list, parent, false)); break; } return holder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof MySignHolder1 && firstList.size() != 0) { MySignHolder1 md1 = (MySignHolder1) holder; if (position == 0) { md1.list_title.setVisibility(View.VISIBLE); md1.list_title.setText("第一种布局"); } if (position == firstList.size() - 1) { md1.list_line.setVisibility(View.GONE); } md1.list_text.setText(firstList.get(position)); } else if (holder instanceof MySignHolder2 && secondList.size() != 0) { MySignHolder2 md2 = (MySignHolder2) holder; int position2 = position - firstList.size(); if (position2 == 0) { md2.list_title.setVisibility(View.VISIBLE); md2.list_title.setText("第二种布局"); } if (position2 == secondList.size() - 1) { md2.list_line.setVisibility(View.GONE); } md2.list_text.setText(secondList.get(position2)); } else if (holder instanceof MySignHolder3 && thirdList.size() != 0) { MySignHolder3 md3 = (MySignHolder3) holder; int position3 = position - (firstList.size() + secondList.size()); if (position3 == 0) { md3.list_title.setVisibility(View.VISIBLE); md3.list_title.setText("第三种布局"); } if (position3 == thirdList.size() - 1) { md3.list_line.setVisibility(View.GONE); } md3.list_text.setText(thirdList.get(position3)); } } @Override public int getItemCount() { return firstList.size() + secondList.size() + thirdList.size(); } //当前的列表布局中有几种不同的分类,那么就在数组中定义n个不重复的数字 int[] type = {0, 1, 2}; @Override public int getItemViewType(int position) { if (position >= 0 && position < firstList.size()) { return type[0]; } else if (position >= firstList.size() && position < firstList.size() + secondList.size()) { return type[1]; } else { return type[2]; } } private class MySignHolder1 extends RecyclerView.ViewHolder { TextView list_title, list_text, list_line; public MySignHolder1(View itemView) { super(itemView); list_title = (TextView) itemView.findViewById(R.id.list_title); list_text = (TextView) itemView.findViewById(R.id.list_text); list_line = (TextView) itemView.findViewById(R.id.list_line); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listener != null) { listener.onClick(v, getLayoutPosition()); } } }); } } private class MySignHolder2 extends RecyclerView.ViewHolder { TextView list_title, list_text, list_line; public MySignHolder2(View itemView) { super(itemView); list_title = (TextView) itemView.findViewById(R.id.list_title); list_text = (TextView) itemView.findViewById(R.id.list_text); list_line = (TextView) itemView.findViewById(R.id.list_line); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listener != null) { listener.onClick(v, getLayoutPosition()); } } }); } } private class MySignHolder3 extends RecyclerView.ViewHolder { TextView list_title, list_text, list_line; public MySignHolder3(View itemView) { super(itemView); list_title = (TextView) itemView.findViewById(R.id.list_title); list_text = (TextView) itemView.findViewById(R.id.list_text); list_line = (TextView) itemView.findViewById(R.id.list_line); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listener != null) { listener.onClick(v, getLayoutPosition()); } } }); } }}
main 里面
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.recycleview.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycleview" android:layout_width="match_parent" android:layout_height="match_parent" /></RelativeLayout>
item
<?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="vertical"> <TextView android:id="@+id/list_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:padding="@dimen/text_10dp" android:text="第一种布局" android:textColor="@color/colorPrimaryDark" android:textSize="@dimen/text_20dp" android:visibility="gone"/> <TextView android:id="@+id/list_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/text_10dp" android:textSize="@dimen/text_10dp" /> <TextView android:id="@+id/list_line" android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/gray" /></LinearLayout>
0 0
- recycleview实现多种布局及点击事件
- Recycleview使用详情及添加点击事件
- RecycleView item点击事件实现,item放大缩小动画布局不变形
- RecycleView如何实现item的点击事件
- RecycleView条目点击事件的实现方法
- RecycleView点击切换布局
- <十>RecycleView点击事件
- RecycleView 点击事件
- Recycleview的点击事件
- RecycleView点击事件
- RecycleView的点击事件
- recycleview点击事件
- recycleview条目点击事件
- Recycleview点击事件
- Recycleview的点击事件
- RecycleView适配器及多条目及点击事件
- RecycleView条目点击事件的实现 接口回调
- RecyclerView使用(二)多种Item布局、添加点击事件
- linux高性能服务器编程之多进程
- java版“本佛祖保佑永无bug”
- bcb链接错误, Unresolved external "XXXX" referenced from YYYY.obj
- DAY5:
- BPM生产安全管理解决方案分享
- recycleview实现多种布局及点击事件
- JS系列——Linq to js使用小结
- 比soap ui方便的webservice调用工具
- Redis服务设置开机自启动
- 复旦大学数学科学学院2015博士研究生招生专业目录
- iOS 常用的跳页方式
- Spring与Akka的集成
- Java进阶---equals()方法总结
- Centos7 下编译openjdk7