Android多路编码,Android RecyclerView选择多个item的实现代码

模仿网易新闻客户端阅读偏好的频道选择,先看实现的页面:

d2af577b33a93e8ea366c29f39690a5e.png

直接上代码:

import android.content.res.Resources;

import android.content.res.TypedArray;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.DefaultItemAnimator;

import android.support.v7.widget.GridLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.support.v7.widget.helper.ItemTouchHelper;

import android.util.Log;

import android.util.SparseBooleanArray;

import android.view.View;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

public class RecyclerViewActivity extends AppCompatActivity {

private RecyclerView recycler;

private RecyclerAdapter mAdapter;

private List channels = new ArrayList<>();

private List channelsSelected;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_recycler_view_acitivity);

initData();

initUI();

findViewById(R.id.resultBTN).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

int lens = channelsSelected.size();

for (int i =0 ; i < lens; i++) {

PreferCustomizableChannel customizableChannel = channelsSelected.get(i);

if (customizableChannel.isSelected()) {

Log.i("RecyclerViewActivity", "onClick: "+customizableChannel.toString());

}

}

}

});

}

private void initData() {

Resources resources = getResources();

TypedArray array = resources.obtainTypedArray(R.array.prefer_channel_icon);

int len = array.length();

String[] name = resources.getStringArray(R.array.prefer_channel_name);

for (int i = 0; i < len; i++) {

PreferCustomizableChannel customizableChannel = new PreferCustomizableChannel();

customizableChannel.setChannel(name[i]);

customizableChannel.setResId(array.getResourceId(i, 0));

customizableChannel.setSelected(false);

customizableChannel.setId(i * 100);

channels.add(customizableChannel);

}

array.recycle();

channelsSelected = channels;

}

private void initUI() {

recycler = (RecyclerView) findViewById(R.id.recycler);

final GridLayoutManager manager = new GridLayoutManager(this, 3);

recycler.setLayoutManager(manager);

recycler.setHasFixedSize(true);

recycler.setItemAnimator(new DefaultItemAnimator());

mAdapter = new RecyclerAdapter(RecyclerViewActivity.this, channels);

recycler.setAdapter(mAdapter);

mAdapter.setClickListener(new OnRecyclerViewItemClickListener() {

@Override

public void onItemClick(View view, int position) {

SparseBooleanArray selecteds = mAdapter.getSelectedItem();

int len = channels.size();

for (int i = 0; i < len; i++) {

if (selecteds.get(i)) {

channelsSelected.get(position).setSelected(true);

}

}

}

});

}

}

布局文件RecyclerView横竖都是“match_parent”,否则在点击的时候gridView会自动上滑一段距离。

适配器的实现:

import android.support.v7.widget.RecyclerView;

import android.util.SparseBooleanArray;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;

import com.entity.PreferCustomizableChannel;

import com.listener.OnRecyclerItemClickListener;

import java.util.List;

import butterknife.BindView;

import butterknife.ButterKnife;

public class PreferChannelAdapter extends RecyclerView.Adapter{

private List lists;

private OnRecyclerItemClickListener listener;

private SparseBooleanArray selectLists = new SparseBooleanArray();

public PreferChannelAdapter() {

}

public void setDatas(List lists) {

this.lists = lists;

notifyDataSetChanged();

}

public void setOnItemClickListener(OnRecyclerItemClickListener listener) {

this.listener = listener;

}

@Override

public PreferChannelHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.prefer_channel_item, null);

return new PreferChannelHolder(view);

}

@Override

public void onBindViewHolder(final PreferChannelHolder holder, final int position) {

PreferCustomizableChannel channelItem = lists.get(position);

holder.channelItemTV.setText(channelItem.getChannel());

holder.channelItemImg.setImageResource(channelItem.getResId());

if (!selectLists.get(position)) {

holder.selectedMarkImg.setVisibility(View.GONE);

} else {

holder.selectedMarkImg.setVisibility(View.VISIBLE);

}

holder.preferChannelItemLayout.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

if (holder.selectedMarkImg.getVisibility() == View.GONE) {

holder.selectedMarkImg.setVisibility(View.VISIBLE);

selectLists.put(position, true);

} else if (holder.selectedMarkImg.getVisibility() == View.VISIBLE){

holder.selectedMarkImg.setVisibility(View.GONE);

selectLists.put(position, false);

}

listener.onRecyclerClick(position);

}

});

}

@Override

public int getItemCount() {

return lists.size();

}

public class PreferChannelHolder extends RecyclerView.ViewHolder {

@BindView(R.id.preferChannelItemLayout)

RelativeLayout preferChannelItemLayout;

@BindView(R.id.channelItemTV)

TextView channelItemTV;

@BindView(R.id.channelItemImg)

ImageView channelItemImg;

@BindView(R.id.selectedMarkImg)

ImageView selectedMarkImg;

public PreferChannelHolder(View itemView) {

super(itemView);

ButterKnife.bind(this, itemView);

}

}

public SparseBooleanArray getSelectedItem() {

return selectLists;

}

}

顺便把item的布局也贴出来吧:

android:id="@+id/preferChannelItemLayout"

android:gravity="center"

android:layout_gravity="center"

android:layout_marginTop="10dp"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:id="@+id/channelItemImg"

android:scaleType="centerInside"

android:layout_width="68dp"

android:layout_height="wrap_content"/>

android:id="@+id/channelItemTV"

android:gravity="center"

android:layout_marginLeft="20dp"

android:layout_marginRight="20dp"

android:layout_marginBottom="20dp"

android:layout_marginTop="8dp"

android:layout_below="@id/channelItemImg"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

android:id="@+id/selectedMarkImg"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:visibility="gone"

android:layout_alignRight="@id/channelItemImg"

android:src="@mipmap/prefer_selected"/>

其他注意的地方:

SpareBooleanArrary.size()返回的是已经设置为true的长度,比如选择了一个则返回1,选择了10则返回10,但在选择了10后去掉一个的时候,size()返回的并不是9,而依然是10,这点注意,所以在遍历的时候并没有使用使用size()取长度。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值