RecyclerView的item的selected、click以及按鍵響應操作的簡單demo
1、在佈局文件中定義 RecyclerView。
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView_settings_title" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@drawable/recycleview_title_background" android:focusable="true" />
recycleview_title_background的內容如下:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="5dp" /> <!-- 邊框的寬度和顏色顏色 --> <stroke android:width="0.2dp" android:color="#ffffff" /> <!-- 背景色 --> <solid android:color="@android:color/transparent"/> </shape>
2、在activity裏設置RecyclerView。
ArrayList<String> settings_help_item_list = new ArrayList<String>();
settings_help_item_list.clear();
settings_help_item_list.add("Contact Us");
settings_help_item_list.add("Messages");
settings_help_item_list.add("Account Status");
mSettingsTitleRecyclerView = findViewById(R.id.recyclerView_settings_title);
LinearLayoutManager layoutManager_settings = new LinearLayoutManager(this);
layoutManager_settings.setOrientation(LinearLayoutManager.HORIZONTAL);
mSettingsTitleRecyclerView.setLayoutManager(layoutManager_settings);
mSettingsTitleRecyclerViewAdapter = new SettingsTitleRecycleViewAdapter(settings_help_item_list);
mSettingsTitleRecyclerView.setAdapter(mSettingsTitleRecyclerViewAdapter);
mSettingsTitleRecyclerViewAdapter.setOnItemSelectListener(new OnRecycleViewItemSelectListener() { @Override public void onItemSelected(View view, int position, boolean hasFocus) { Log.d("wujiang", "mSettingsTitleRecyclerViewAdapter onItemSelected: position = " + position); mSettingsTitleRecyclerViewCurrentPosition = position; ObjectAnimator animator1; ObjectAnimator animator2; if(hasFocus == true) { mSettingsTitleRecyclerViewFocused = true; ((TextView) view).setTextColor(Color.YELLOW); animator1 = ObjectAnimator.ofFloat(view, "scaleX", 1f, 1.05f); animator2 = ObjectAnimator.ofFloat(view, "scaleY", 1f, 1.05f); showSettingsHelpFragments(mChannelGroupRecyclerViewCurrentPosition, mSettingsTitleRecyclerViewCurrentPosition); } else { mSettingsTitleRecyclerViewFocused = false; ((TextView) view).setTextColor(Color.WHITE); animator1 = ObjectAnimator.ofFloat(view, "scaleX", 1.05f, 1f); animator2 = ObjectAnimator.ofFloat(view, "scaleY", 1.05f, 1f); } AnimatorSet animSet = new AnimatorSet(); animSet.setDuration(200); animSet.playTogether(animator1, animator2); animSet.start(); } }); /* Settings Title RecyclerView 的Item Click的響應函數 */ mSettingsTitleRecyclerViewAdapter.setOnItemClickLister(new OnRecycleViewItemClickListener() { @Override public void onItemClick(View view, int position) { Log.d("wujiang", "mSettingsTitleRecyclerViewAdapter: onItemClick, position = " + position); if (mTitleRecylerViewCurrentPostion == TITLE_SETTINGS_ITEM) { Log.d("wujiang", "mSettingsTitleRecyclerViewAdapter: onItemClick 111"); } } }); /* 設置Settings Title RecyclerView 的按鍵響應接口 */ mSettingsTitleRecyclerViewAdapter.setOnKeyListener(mSettingsRecyclerViewOnKey);
private View.OnKeyListener mSettingsRecyclerViewOnKey = new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP) { return false; } switch (keyCode) { case KeyEvent.KEYCODE_DPAD_DOWN: Log.d("wujiang", "mSettingsRecyclerViewOnKey: KEYCODE_DPAD_DOWN"); Fragment fragment = getSupportFragmentManager().findFragmentByTag(HELP_FRAGMENT); if (fragment instanceof SettingsHelpFragment) { Log.d("wujiang", "mSettingsRecyclerViewOnKey: fragment instanceof SettingsHelpFragment"); if (mSettingsTitleRecyclerViewCurrentPosition == SETTINGS_HELP_MESSAGES) { ((SettingsHelpFragment) fragment).initFocusView(); } } return true; case KeyEvent.KEYCODE_DPAD_UP: Log.d("wujiang", "mSettingsRecyclerViewOnKey: KEYCODE_DPAD_UP"); return true; case KeyEvent.KEYCODE_DPAD_LEFT: Log.d("wujiang", "mSettingsRecyclerViewOnKey: KEYCODE_DPAD_LEFT"); if (mSettingsTitleRecyclerViewCurrentPosition == 0) { Log.d("wujiang", "mSettingsRecyclerViewOnKey: KEYCODE_DPAD_LEFT 01"); return true; } break; case KeyEvent.KEYCODE_DPAD_RIGHT: Log.d("wujiang", "mSettingsRecyclerViewOnKey: KEYCODE_DPAD_RIGHT"); if (mSettingsTitleRecyclerViewCurrentPosition == (mSettingsTitleRecyclerView.getAdapter().getItemCount() - 1)) { Log.d("wujiang", "mSettingsRecyclerViewOnKey: KEYCODE_DPAD_RIGHT 01"); return true; } break; case KeyEvent.KEYCODE_BACK: Log.d("wujiang", "mSettingsRecyclerViewOnKey: KeyEvent.KEYCODE_BACK"); int firstItemPosition = mChannelGroupRecyclerView.getFirstVisiblePosition(); if ((mChannelGroupRecyclerViewCurrentPosition - firstItemPosition) > 0) { mChannelGroupRecyclerView.getChildAt(mChannelGroupRecyclerViewCurrentPosition - firstItemPosition).requestFocus(); } else { mChannelGroupRecyclerView.getChildAt(0).requestFocus(); } FragmentManager fragmentManager = getSupportFragmentManager(); Fragment willRemoveFragment = fragmentManager.findFragmentByTag(HELP_FRAGMENT); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(willRemoveFragment).commit(); return true; default: break; } return false; } };
3、mSettingsTitleRecyclerViewAdapter類的定義
package com.amlogic.dvb_adapter; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.amlogic.DVBPlayer.R; import com.amlogic.dvb_interface.OnRecycleViewItemClickListener; import com.amlogic.dvb_interface.OnRecycleViewItemSelectListener; import java.util.ArrayList; public class SettingsTitleRecycleViewAdapter extends RecyclerView.Adapter<SettingsTitleRecycleViewAdapter.ViewHolder> { private ArrayList<String> mTitleNameList; private OnRecycleViewItemSelectListener mOnItemSelectLister; private OnRecycleViewItemClickListener mOnItemClickLister; private View.OnKeyListener mOnKeyListener; static class ViewHolder extends RecyclerView.ViewHolder { private TextView mTitleName; public ViewHolder(View view) { super(view); mTitleName = (TextView) view.findViewById(R.id.name); } } public SettingsTitleRecycleViewAdapter(ArrayList<String> title_list) { mTitleNameList = new ArrayList<String>(); mTitleNameList.clear(); mTitleNameList.addAll(title_list); } public void setOnItemSelectListener(OnRecycleViewItemSelectListener listener) { mOnItemSelectLister = listener; } public void setOnItemClickLister(OnRecycleViewItemClickListener listener) { mOnItemClickLister = listener; } public void setOnKeyListener(View.OnKeyListener listener) { mOnKeyListener = listener; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.settings_title_recycleview_holder, viewGroup, false); ViewHolder holder = new ViewHolder(view); return holder; } @Override public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int position) { //Log.d("wujiang", "onBindViewHolder: i = " + position); String name = mTitleNameList.get(position); //Log.d("wujiang", "onBindViewHolder: name = " + name); viewHolder.mTitleName.setText(name); if(mOnItemSelectLister != null) { viewHolder.mTitleName.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean hasFocus) { if(hasFocus) { mOnItemSelectLister.onItemSelected(view, position, true); } else { mOnItemSelectLister.onItemSelected(view, position, false); } } }); } if (mOnItemClickLister != null) { viewHolder.mTitleName.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mOnItemClickLister.onItemClick(view, position); } }); } if (mOnKeyListener != null) { viewHolder.mTitleName.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { return mOnKeyListener.onKey(v, keyCode, event); } }); } } @Override public int getItemCount() { //Log.d("wujiang", "SettingsTitleRecycleViewAdapter: getItemCount = " + mTitleNameList.size()); return mTitleNameList.size(); } public void updateDate(ArrayList<String> new_data) { Log.d("wujiang", "SettingsTitleRecycleViewAdapter: updateDate: new_data.size = " + new_data.size()); mTitleNameList.clear(); mTitleNameList.addAll(new_data); notifyDataSetChanged(); } }
settings_title_recycleview_holder的內容:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="30dp"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="match_parent" android:focusable="true" android:paddingLeft="10dp" android:paddingRight="10dp" android:textColor="@android:color/white" android:maxLines="1" android:gravity="center"/> </LinearLayout>
上面那麼多代碼,只要看關鍵代碼就可知道recyclerView的selected、click以及按鍵響應操作的方法了。