横向recyclerView程序自动切换并高亮选中item

来源:互联网 发布:基坑监测数据处理软件 编辑:程序博客网 时间:2024/06/11 16:27
思路:
Adapter实现点击和高亮事件,然后在recyclerView滚动到对应位置并performClick:
mRecyclerView.scrollToPosition(index);mRecyclerView.postDelayed(new Runnable(){    @Override    public void run()    {        if(mRecyclerView.findViewHolderForAdapterPosition(index)!=null )        {            mRecyclerView.findViewHolderForAdapterPosition(index).itemView.performClick();        }    }},50);
一定要用postDelayed,不然切换到屏幕外的item会报错null,参考:
http://stackoverflow.com/questions/32836844/android-recyclerview-findviewholderforadapterposition-returns-null
其中adapter代码如下:
public class PlayerScoreAdapter extends RecyclerView.Adapter<PlayerScoreAdapter.ViewHolder> /*implements View.OnClickListener*/{    private  Player[]  players;    private Context context;    private int selectedPos = 0;    public PlayerScoreAdapter(Player[] players, Context context) {        this.players = players;        this.context = context;    }    private OnRecyclerViewItemClickListener mOnItemClickListener = null;    //define interface    public interface OnRecyclerViewItemClickListener {        void onItemClick(View view , String data);    }    //创建新View,被LayoutManager所调用    @Override    public ViewHolder onCreateViewHolder(ViewGroup viewGroup,  int viewType) {        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_player_score, viewGroup, false);        ViewHolder vh = new ViewHolder(view);        //将创建的View注册点击事件//        view.setOnClickListener(this);        return vh;    }    //将数据与界面进行绑定的操作    @Override    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {        viewHolder.itemView.setSelected(selectedPos == position);        // Handle item click and set the selection//        viewHolder.itemView.setFocusable(true);        ImageView imageView = (ImageView)viewHolder.itemView.findViewById(R.id.head_image);        if(selectedPos == position){            imageView.setImageAlpha(255);        }else{            imageView.setImageAlpha(100);        }        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // Redraw the old selection and the new                notifyItemChanged(selectedPos);                selectedPos = position;                notifyItemChanged(selectedPos);//                notifyItemRangeChanged(0, players.length);                mOnItemClickListener.onItemClick(v,(String)v.getTag());            }        });        Glide.with(context).load(players[position].getHeadImg())                .bitmapTransform(new CropCircleTransformation(context))                .crossFade(1000).error(R.mipmap.head_sample).into(viewHolder.mImageView);        //将数据保存在itemView的Tag中,以便点击时进行获取        viewHolder.itemView.setTag(players[position].getName());    }    /*@Override    public void onClick(View v) {        if (mOnItemClickListener != null) {            //注意这里使用getTag方法获取数据            mOnItemClickListener.onItemClick(v,(String)v.getTag());        }    }*/    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {        this.mOnItemClickListener = listener;    }    //获取数据的数量    @Override    public int getItemCount() {        return players.length;    }    //自定义的ViewHolder,持有每个Item的的所有界面元素    public class ViewHolder extends RecyclerView.ViewHolder {        public ImageView mImageView;        public ViewHolder(View view){            super(view);            mImageView = (ImageView) view.findViewById(R.id.head_image);        }    }}
1 0