RecyclerView學習筆記整理(3)解決item中關於跳轉到另一個Activity的問題和判斷多個item進行跳轉到另一個Activity

幻影坦克TG-009發表於2019-01-07

首先我們需要解決一個問題

RecyclerView中的item如何從A到B跳轉的問題?還有然後當我們解決了一個問題以後出現了第二個問題當出現多個item的時候如何從中進行跳轉?
為此我們需要提前儲備一些些知識。
需要先了解一些這篇文章如果對於item的點選事件不太瞭解的話。
Android中RecyclerView的Item點選事件(總結)
有需要下載原始碼可以點選:
https://github.com/307572384/recycleitemnew
也可以下這個csdn的
https://download.csdn.net/download/qq_16519957/10905113

我們先來看一下實現的效果
在這裡插入圖片描述

這個是點選同意後進入後的activity的效果
在這裡插入圖片描述

點選拒絕後顯示當前item的位置資訊
在這裡插入圖片描述

顯示點選同意後第3個item顯示的資訊
在這裡插入圖片描述

首先我們寫一個實體類Data來存放我們Adapter所需要的東西

package com.beta.recycleitem;



public class Data {
	public static final int TYPE_ONE = 1;//型別1
	public static final int TYPE_TWO = 2;//型別2

	public int type;//item內容 型別


	public String message;
	public Data(int type, String message) {
		this.type = type;

		this.message = message;
	}

	public static int getTypeOne() {
		return TYPE_ONE;
	}

	public static int getTypeTwo() {
		return TYPE_TWO;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}



	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}


}

我們來寫Recyclerview的Adpter主要就是存放點選事件

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;


public class MyRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
	private List<Data> list;//資料來源
	private Context    mcontent;//上下文

	public MyRecyclerViewAdapter(List<Data> list, Context context) {
		this.list = list;
		this.mcontent = context;

	}

	@Override
	public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
		//選擇型別
		switch (viewType) {
			case Data.TYPE_ONE:
				View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itemone, parent, false);
				return new OneViewHolder(view);
			case Data.TYPE_TWO:
				view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itemtwo, parent, false);
				return new TwoViewHolder(view);
		}
		return null;
	}

	@Override
	public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

	}

	@Override
	public int getItemCount() {

		return list.size();
	}

	//item型別
	@Override
	public int getItemViewType(int position) {
		return list.get(position).type;
	}

	//第一步:自定義一個回撥介面來實現Click和LongClick事件
	public interface OnItemClickListener {
		void onItemClick(View v, int position);

		void onItemLongClick(View v);
	}

	public OnItemClickListener mOnItemClickListener;//第二步:宣告自定義的介面

	//第三步:定義方法並暴露給外面的呼叫者
	public void setOnItemClickListener(OnItemClickListener listener) {
		this.mOnItemClickListener = listener;
	}

	//第一個item型別
	class OneViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
		private Button btnAgree, btnRefuse;

		public OneViewHolder(View itemView) {
			super(itemView);
			btnAgree = itemView.findViewById(R.id.btn_agree);
			btnRefuse = itemView.findViewById(R.id.btn_refuse);
			// 為item及item內部控制元件新增點選事件
			itemView.setOnClickListener(this);
			btnAgree.setOnClickListener(this);
			btnRefuse.setOnClickListener(this);
		}


		@Override
		public void onClick(View v) {
			if (mOnItemClickListener != null) {
				mOnItemClickListener.onItemClick(v,getAdapterPosition());
			}
		}
	}

	//第二個item型別
	class TwoViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {


		public TwoViewHolder(View itemView) {
			super(itemView);
			// 為item新增點選事件
			itemView.setOnClickListener(this);
		}

		@Override
		public void onClick(View v) {
			if (mOnItemClickListener != null) {
				mOnItemClickListener.onItemClick(v, getAdapterPosition());
			}
		}
	}
}

我們來寫一個Mantivity這裡主要是為了實現點選事件進行跳轉的

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

	private RecyclerView          rv_recy;
	private MyRecyclerViewAdapter adpter;
	private List<Data>            list;

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

		rv_recy.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));//佈局管理器
		adpter = new MyRecyclerViewAdapter(list, this);//從adapter中獲取到儲存的資料來源list
		rv_recy.setAdapter(adpter);
		//設定item及item中的控制元件點選事件
		adpter.setOnItemClickListener(MyItemClickListener);
	}


	private void initView() {
		rv_recy = (RecyclerView) findViewById(R.id.rv_recy);
	}

	//存放生成條目
	private void initData() {
		list = new ArrayList<>();
		list.add(new Data(1, "看看這個資源吧"));
		list.add(new Data(2, "1"));
		list.add(new Data(1, "2"));
		list.add(new Data(2, "3"));
		list.add(new Data(1, "4"));
		list.add(new Data(2, "5"));
		list.add(new Data(1, "6"));
		list.add(new Data(2, "7"));

	}

	/**
	 * item+item裡的控制元件點選監聽事件
	 */
	private MyRecyclerViewAdapter.OnItemClickListener MyItemClickListener = new MyRecyclerViewAdapter.OnItemClickListener() {

		@Override
		public void onItemClick(View v, int position) {
			switch (v.getId()) {
				case R.id.btn_agree:
					//對item進行判斷如果是第一個那麼我們進行跳轉反之則提示訊息
						if(position==0) {//這裡position用於判斷item是第幾個條目然後我們對其設定就可以跳轉了。
							Intent intent = new Intent(MainActivity.this, testActivity.class);
							intent.putExtra("name", list.get(position).toString());
							startActivity(intent);

						}
						else{
							Toast.makeText(MainActivity.this, "你點選了同意按鈕" + (position + 1), Toast.LENGTH_SHORT).show();
						}

					break;
				case R.id.btn_refuse:
					Toast.makeText(MainActivity.this, "你點選了拒絕按鈕" + (position + 1), Toast.LENGTH_SHORT).show();
					break;
				default:
					Toast.makeText(MainActivity.this, "你點選了item按鈕" + (position + 1), Toast.LENGTH_SHORT).show();
					break;
			}
		}

		@Override
		public void onItemLongClick(View v) {

		}


	};

}

這個主要就是testActivity的一個這個非常簡單的,這裡我推薦大家使用的一個自動生成佈局程式碼外掛Android Studio 自動生成佈局程式碼外掛


import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.Button;
import android.widget.ToggleButton;



public class testActivity extends Activity implements View.OnClickListener {
	private Button       button;
	private Button       test2;
	private ToggleButton test;

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

	}

	private void initView() {
		button = (Button) findViewById(R.id.button);

		button.setOnClickListener(this);
		test2 = (Button) findViewById(R.id.test2);
		test2.setOnClickListener(this);
		test = (ToggleButton) findViewById(R.id.test);
		test.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
			case R.id.button:

				break;
			case R.id.test2:
				break;
			case R.id.test:
				break;
		}
	}
}

activity_main.xml的佈局這裡非常簡單就一個RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.beta.recycleitem.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_recy"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>

</android.support.constraint.ConstraintLayout>

itemone

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff">
    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:src="@mipmap/ic_launcher"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:orientation="vertical"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/iv_icon">
        <TextView
            android:id="@+id/tv_username"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="username" />
        <TextView
            android:id="@+id/tv_message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:text="無雙?" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:orientation="horizontal"
        android:paddingRight="5dp"
        android:layout_centerVertical="true">
        <Button
            android:id="@+id/btn_agree"
            android:layout_width="60dp"
            android:layout_height="40dp"
            android:text="同意"
            android:textSize="10dp"/>
        <Button
            android:id="@+id/btn_refuse"
            android:layout_width="60dp"
            android:layout_height="40dp"
            android:text="拒絕"
            android:textSize="10dp"/>
    </LinearLayout>
</RelativeLayout>

itemtwo

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff">
    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:src="@mipmap/ic_launcher"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:orientation="vertical"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/iv_icon">
        <TextView
            android:id="@+id/tv_username"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="username" />
    </LinearLayout>
</RelativeLayout>

testActivity的佈局activitytwo.xml

<?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="match_parent">

    <Button
        android:id="@+id/test2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Button" />

    <ToggleButton
        android:id="@+id/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="ToggleButton" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Button" />
</LinearLayout>

參考android RecyclerView介面卡實現多佈局item+item內部控制元件點選事件

相關文章