Android TV開發(fā):使用RecycleView實現(xiàn)橫向的Listview并響應(yīng)點擊事件的代碼
本文講述了Android TV開發(fā):使用RecycleView實現(xiàn)橫向的Listview并響應(yīng)點擊事件的代碼。分享給大家供大家參考,具體如下:
1.先貼出自己的效果圖(可橫向滾動,并響應(yīng)item點擊事件):

2.關(guān)于點擊事件的實現(xiàn)細節(jié)
核心:使用接口回調(diào)
在adapter中自己定義了個接口,然后在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è)置點擊事件
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)聽,并實現(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.實現(xiàn)橫向效果
核心:LinearLayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext,LinearLayoutManager.HORIZONTAL,false); mRecyclerView.setLayoutManager(linearLayoutManager);
4. 讓RecyclerView的子item獲得焦點
mRecyclerView.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
if(mRecyclerView.getChildCount()>0){
mRecyclerView.getChildAt(0).requestFocus();
}
}
}
});
5.代碼實現(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)聽點擊事件
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();
}
}
}
});
}
//定義適配器類
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();
}
/**
* 創(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)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android Studio搜索功能(查找功能)及快捷鍵圖文詳解
這篇文章主要介紹了Android Studio搜索功能(查找功能)及快捷鍵圖文詳解,本文圖文并茂給大家介紹的非常詳細,需要的朋友可以參考下2017-12-12
Android webview和js互相調(diào)用實現(xiàn)方法
這篇文章主要介紹了 Android webview和js互相調(diào)用實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2016-10-10
Android 邊播邊緩存的實現(xiàn)(MP4 未加密m3u8)
這篇文章主要介紹了Android 邊播邊緩存的實現(xiàn)(MP4 未加密m3u8),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
Android實現(xiàn)RecyclerView添加分割線的簡便方法
這篇文章主要介紹了Android實現(xiàn)RecyclerView添加分割線的簡便方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
安卓Android6.0權(quán)限動態(tài)獲取操作示例
這篇文章主要介紹了安卓Android6.0權(quán)限動態(tài)獲取操作,結(jié)合實例形式分析了Android6.0針對權(quán)限的動態(tài)獲取、授權(quán)等相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
Android開發(fā)實現(xiàn)自定義水平滾動的容器示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)自定義水平滾動的容器,涉及Android滾動容器的事件響應(yīng)、屬性運算與修改相關(guān)操作技巧,需要的朋友可以參考下2017-10-10

