RecyclerView的item的selected、click以及按鍵響應操作的簡單demo

                    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以及按鍵響應操作的方法了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章