recycleview實現多種佈局及點擊事件

首先給大家展示下出來的效果:

這裏用linearlayout是需要寫很多累贅的代碼,作爲一個小菜鳥,我是比較習慣於偷懶的。

所以就想到了用recycleview,但是也碰到了很多坑,分享給大家

不bb直接上代碼。



1.導入design包


2.MainActivitiy類,

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;
    //這裏用的是三個list,一個list也是可以實現上述的效果。但是需要判斷list(position)
    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);
        }
    }

}



3.FullLinearlayoutManager類


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();
        }
    }

}


4.Adapter

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());
                    }
                }
            });
        }
    }
}


5.layout裏面的佈局
<?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>
 
<?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>

最後附上鍊接點擊打開鏈接



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章