本文講述了Android TV開發:使用RecycleView實現橫向的Listview并響應點擊事件的代碼。分享給大家供大家參考,具體如下:
1.先貼出自己的效果圖(可橫向滾動,并響應item點擊事件):
2.關于點擊事件的實現細節
核心:使用接口回調
在adapter中自己定義了個接口,然后在onBindViewHolder中去為holder.itemView去設置相應的監聽最后回調我們設置的監聽。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
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)); // 如果設置了回調,則設置點擊事件 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設置監聽,并實現接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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.實現橫向效果
核心:LinearLayoutManager
1
2
|
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL, false ); mRecyclerView.setLayoutManager(linearLayoutManager); |
4. 讓RecyclerView的子item獲得焦點
1
2
3
4
5
6
7
8
9
10
|
mRecyclerView.setOnFocusChangeListener( new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus){ if (mRecyclerView.getChildCount()> 0 ){ mRecyclerView.getChildAt( 0 ).requestFocus(); } } } }); |
5.代碼實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
//定義自己的布局文件 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); //設置適配器 mAdapter = new MyAdapter( mContext,mDatas); mRecyclerView.setAdapter(mAdapter); //監聽點擊事件 mAdapter.setmOnItemClickLitener( new MyAdapter.OnItemClickLitener() { @Override public void onItemClick(View view, int position) { Toast.makeText(mContext, "點擊了圖片:" +position,Toast.LENGTH_SHORT).show(); } }); //讓RecyclerView的子item獲得焦點 mRecyclerView.setOnFocusChangeListener( new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus){ if (mRecyclerView.getChildCount()> 0 ){ mRecyclerView.getChildAt( 0 ).requestFocus(); } } } }); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
//定義適配器類 public static class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context mContext; private List<String> mDatas; private LayoutInflater mInflater; private OnItemClickLitener mOnItemClickLitener; //定義點擊事件的接口 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(); } /** * 創建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; } /** * 設置值 */ @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); //設置回調 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); } } } |
1
2
3
4
5
6
7
8
9
|
//在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文件
1
2
3
4
5
6
7
8
9
|
<? 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
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://blog.csdn.net/meetings/article/details/52926720