Android RecyclerView選擇多個item的實現(xiàn)代碼
模仿網(wǎng)易新聞客戶端閱讀偏好的頻道選擇,先看實現(xiàn)的頁面:
直接上代碼:
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<PreferCustomizableChannel> channels = new ArrayList<>(); private List<PreferCustomizableChannel> 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會自動上滑一段距離。
適配器的實現(xiàn):
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<PreferChannelAdapter.PreferChannelHolder>{ private List<PreferCustomizableChannel> lists; private OnRecyclerItemClickListener listener; private SparseBooleanArray selectLists = new SparseBooleanArray(); public PreferChannelAdapter() { } public void setDatas(List<PreferCustomizableChannel> 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的布局也貼出來吧:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 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:gravity="center" android:layout_gravity="center"--> <ImageView android:id="@+id/channelItemImg" android:scaleType="centerInside" android:layout_width="68dp" android:layout_height="wrap_content"/> <TextView 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" /> <ImageView 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"/> </RelativeLayout>
其他注意的地方:
SpareBooleanArrary.size()返回的是已經(jīng)設(shè)置為true的長度,比如選擇了一個則返回1,選擇了10則返回10,但在選擇了10后去掉一個的時候,size()返回的并不是9,而依然是10,這點注意,所以在遍歷的時候并沒有使用使用size()取長度。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中RecyclerView點擊Item設(shè)置事件
- Android RecyclerView的Item自定義動畫及DefaultItemAnimator源碼分析
- Android RecyclerView的Item點擊事件實現(xiàn)整理
- Android 中RecyclerView多種item布局的寫法(頭布局+腳布局)
- android RecyclerView實現(xiàn)條目Item拖拽排序與滑動刪除
- android使用ItemDecoration給RecyclerView 添加水印
- Android RecyclerView顯示Item布局不一致解決辦法
- Android中RecyclerView的item寬高問題詳解
相關(guān)文章
Kotlin標準函數(shù)與靜態(tài)方法基礎(chǔ)知識詳解
Kotlin中的標準函數(shù)指的是Standard.kt文件中定義的函數(shù),任何Kotlin代碼都可以自由地調(diào)用所有的標準函數(shù)。例如let這個標準函數(shù),他的主要作用就是配合?.操作符來進行輔助判空處理2022-11-11Android 中使用 dlib+opencv 實現(xiàn)動態(tài)人臉檢測功能
完成 Android 相機預(yù)覽功能以后,在此基礎(chǔ)上我使用 dlib 與 opencv 庫做了一個關(guān)于人臉檢測的 demo。接下來通過本文給大家介紹Android 中使用 dlib+opencv 實現(xiàn)動態(tài)人臉檢測功能 ,需要的朋友可以參考下2018-11-11Android使用友盟集成QQ、微信、微博等第三方分享與登錄方法詳解
之前的項目第三方分享和登錄一直都使用ShareSDK實現(xiàn)的。為了統(tǒng)一使用友盟的全家桶,所以三方分享和登錄也就選擇了友盟,這里為大家整理出詳細方法2018-03-03AndroidStudio構(gòu)建項目提示錯誤信息“unable to find valid certification”的
這篇文章主要介紹了AndroidStudio構(gòu)建項目提示“unable to find valid certification”最新解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Android性能優(yōu)化之弱網(wǎng)優(yōu)化詳解
這篇文章主要為大家介紹了Android性能優(yōu)化之弱網(wǎng)優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10解決flutter 錯誤: 程序包androidx.lifecycle不存在問題
這篇文章主要介紹了解決flutter 錯誤: 程序包androidx.lifecycle不存在問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09