Android TV開發(fā):使用RecycleView實(shí)現(xiàn)橫向的Listview并響應(yīng)點(diǎn)擊事件的代碼
本文講述了Android TV開發(fā):使用RecycleView實(shí)現(xiàn)橫向的Listview并響應(yīng)點(diǎn)擊事件的代碼。分享給大家供大家參考,具體如下:
1.先貼出自己的效果圖(可橫向滾動,并響應(yīng)item點(diǎn)擊事件):
2.關(guān)于點(diǎn)擊事件的實(shí)現(xiàn)細(xì)節(jié)
核心:使用接口回調(diào)
在adapter中自己定義了個(gè)接口,然后在onBindViewHolder中去為holder.itemView去設(shè)置相應(yīng)的監(jiān)聽最后回調(diào)我們設(shè)置的監(jiān)聽。
class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> { //... public interface OnItemClickLitener { void onItemClick(View view, int position); void onItemLongClick(View view , int position); } private OnItemClickLitener mOnItemClickLitener; public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) { this.mOnItemClickLitener = mOnItemClickLitener; } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.tv.setText(mDatas.get(position)); // 如果設(shè)置了回調(diào),則設(shè)置點(diǎn)擊事件 if (mOnItemClickLitener != null) { holder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickLitener.onItemClick(holder.itemView, pos); } }); holder.itemView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickLitener.onItemLongClick(holder.itemView, pos); return false; } }); } } //... }
在activity設(shè)置監(jiān)聽,并實(shí)現(xiàn)接口
mAdapter.setOnItemClickLitener(new OnItemClickLitener() { @Override public void onItemClick(View view, int position) { Toast.makeText(HomeActivity.this, position + " click", Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(View view, int position) { Toast.makeText(HomeActivity.this, position + " long click", Toast.LENGTH_SHORT).show(); mAdapter.removeData(position); } });
3.實(shí)現(xiàn)橫向效果
核心:LinearLayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL,false); mRecyclerView.setLayoutManager(linearLayoutManager);
4. 讓RecyclerView的子item獲得焦點(diǎn)
mRecyclerView.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){ if(mRecyclerView.getChildCount()>0){ mRecyclerView.getChildAt(0).requestFocus(); } } } });
5.代碼實(shí)現(xiàn):
//定義自己的布局文件 public class EasyLayout extends LinearLayout{ private MyAdapter mAdapter; private RecyclerView mRecyclerView; private Context mContext; private List<String> mDatas; public EasyLayout(Context context) { super(context); mDatas = new ArrayList<String>(); for (int i=0;i<20;i++){ String str = "圖片:"+i; mDatas.add(str); } this.setBackgroundColor(Color.parseColor("#407EAf")); this.mContext = context; this.setOrientation(VERTICAL); createLayout(); } private void createLayout() { //空出上邊留白 TextView te = new TextView(mContext); ViewGroup.LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,160); this.addView(te,lp); mRecyclerView = new RecyclerView(mContext); lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); this.addView(mRecyclerView,lp); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL,false); mRecyclerView.setLayoutManager(linearLayoutManager); //設(shè)置適配器 mAdapter = new MyAdapter( mContext,mDatas); mRecyclerView.setAdapter(mAdapter); //監(jiān)聽點(diǎn)擊事件 mAdapter.setmOnItemClickLitener(new MyAdapter.OnItemClickLitener() { @Override public void onItemClick(View view, int position) { Toast.makeText(mContext,"點(diǎn)擊了圖片:"+position,Toast.LENGTH_SHORT).show(); } }); //讓RecyclerView的子item獲得焦點(diǎn) mRecyclerView.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus){ if(mRecyclerView.getChildCount()>0){ mRecyclerView.getChildAt(0).requestFocus(); } } } }); }
//定義適配器類 public static class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context mContext; private List<String> mDatas; private LayoutInflater mInflater; private OnItemClickLitener mOnItemClickLitener; //定義點(diǎn)擊事件的接口 public interface OnItemClickLitener { void onItemClick(View view, int position); } public MyAdapter( Context mContext,List<String> datats) { this.mContext = mContext; this.mDatas = datats; mInflater = LayoutInflater.from(this.mContext); } public void setmOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) { this.mOnItemClickLitener = mOnItemClickLitener; } @Override public int getItemCount() { return mDatas.size(); } /** * 創(chuàng)建ViewHolder */ @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int i) { View view = mInflater.inflate(R.layout.easy_item,null); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } /** * 設(shè)置值 */ @Override public void onBindViewHolder(final ViewHolder viewHolder, final int position) { viewHolder.btn.setText(mDatas.get(position)); viewHolder.btn.setTextSize(40); viewHolder.btn.setGravity(Gravity.CENTER); //設(shè)置回調(diào) if (mOnItemClickLitener != null){ viewHolder.btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int pos = viewHolder.getLayoutPosition(); mOnItemClickLitener.onItemClick( viewHolder.btn,pos); } }); } } public class ViewHolder extends RecyclerView.ViewHolder //我們需要inflate的item布局需要傳入 { Button btn; public ViewHolder(View arg0) { super(arg0); btn = (Button) arg0.findViewById(R.id.btn); } } }
//在activity加載自己的布局 public class GallarRecyActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); EasyLayout easyLayout = new EasyLayout(this); setContentView(easyLayout); } }
easy_item.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btn" android:layout_width="320dp" android:layout_height="430dp" /> </LinearLayout>
6.源碼及apk
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android Studio搜索功能(查找功能)及快捷鍵圖文詳解
這篇文章主要介紹了Android Studio搜索功能(查找功能)及快捷鍵圖文詳解,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-12-12Android webview和js互相調(diào)用實(shí)現(xiàn)方法
這篇文章主要介紹了 Android webview和js互相調(diào)用實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2016-10-10Android自定義控件實(shí)現(xiàn)支付寶記賬餅圖
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)支付寶記賬餅圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Android 邊播邊緩存的實(shí)現(xiàn)(MP4 未加密m3u8)
這篇文章主要介紹了Android 邊播邊緩存的實(shí)現(xiàn)(MP4 未加密m3u8),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Android實(shí)現(xiàn)RecyclerView添加分割線的簡便方法
這篇文章主要介紹了Android實(shí)現(xiàn)RecyclerView添加分割線的簡便方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android動態(tài)顯示具體到秒的相聚時(shí)間
這篇文章主要為大家詳細(xì)介紹了Android動態(tài)顯示具體到秒的相聚時(shí)間,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05安卓Android6.0權(quán)限動態(tài)獲取操作示例
這篇文章主要介紹了安卓Android6.0權(quán)限動態(tài)獲取操作,結(jié)合實(shí)例形式分析了Android6.0針對權(quán)限的動態(tài)獲取、授權(quán)等相關(guān)操作技巧,需要的朋友可以參考下2018-02-02Android開發(fā)實(shí)現(xiàn)自定義水平滾動的容器示例
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)自定義水平滾動的容器,涉及Android滾動容器的事件響應(yīng)、屬性運(yùn)算與修改相關(guān)操作技巧,需要的朋友可以參考下2017-10-10