android - 修复recyclerview选中项的位置

标签 android android-recyclerview

我正在 Android TV 上制作应用程序。我有一个 RecyclerView 显示水平方向的视频缩略图,由 DPAD 控件选择。我已经通过 apdapter 中的 DAPD 控件处理了 Recyclerview 的选择。它工作正常。现在,当我们滚动 DPAD 控件时,我想在第一个位置显示 RecylcerViw 的选定项目。我该怎么做?

下面是适配器类

public class TrendingAdapter extends RecyclerView.Adapter<TrendingAdapter.MyViewHolder>{
    Activity context;
    int focusedItem = 0;
    ArrayList<VideoContentModel> catVideoList;

    public TrendingAdapter(Activity context,ArrayList<VideoContentModel> catVideoList) {
        super();
        this.context = context;
        this.catVideoList = catVideoList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.trending_item_row,parent,false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.itemView.setSelected(focusedItem == position);

        VideoContentModel model = catVideoList.get(position);
        ImageLoader imageLoader = MyApplication.getInstance().getImageLoader();
        holder.thumbnailView.setImageUrl(model.getVideoThumbnailUrl(), imageLoader);
        //holder.thumbnailView.setImageUrl("http://www.calkinsmobile.com/uploads/hd-image/1436441227_87302_cook_this___1.jpg", imageLoader);

    }

    @Override
    public int getItemCount() {
        return catVideoList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
        NetworkImageView thumbnailView;

        public MyViewHolder(View itemView) {
            super(itemView);

            thumbnailView = (NetworkImageView)itemView.findViewById(R.id.trend_thumbnail);


            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Redraw the old selection and the new
//                    notifyItemChanged(focusedItem);
//                    focusedItem = getLayoutPosition();
//                    notifyItemChanged(focusedItem);
                }
            });

        }

    }



        @Override
    public void onAttachedToRecyclerView(final RecyclerView recyclerView) {
        // TODO Auto-generated method stub
        super.onAttachedToRecyclerView(recyclerView);

        recyclerView.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // TODO Auto-generated method stub
                RecyclerView.LayoutManager lm = recyclerView.getLayoutManager();

                // Return false if scrolled to the bounds and allow focus to move off the list
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
                        return tryMoveSelection(lm, 1);
                    } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
                        return tryMoveSelection(lm, -1);
                    }else if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER){
                        //Toast.makeText(context, "Item click on positon ="+focusedItem, Toast.LENGTH_LONG).show();

                        Intent intent = new Intent(context,VideoDetailsActivity.class);
                        intent.putParcelableArrayListExtra("videoList",catVideoList);
                        context.startActivity(intent);

                    }
                }


                return false;
            }
        });

    }

        private boolean tryMoveSelection(RecyclerView.LayoutManager lm, int direction) {
            int tryFocusItem = focusedItem + direction;

            // If still within valid bounds, move the selection, notify to redraw, and scroll
            if (tryFocusItem >= 0 && tryFocusItem < getItemCount()) {
                focusedItem = tryFocusItem;
                notifyItemChanged(focusedItem);
                lm.scrollToPosition(focusedItem);
                return true;
            }

            return false;
        }

}

下面是我的recyclerview

recyclerView = (RecyclerView)findViewById(R.id.trending_recylcer);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        TrendingAdapter adapter = new TrendingAdapter(this, videoList);
        recyclerView.setAdapter(adapter);

最佳答案

@Override
public int getItemViewType(int position)
{
    return position;
}

@Override
public long getItemId(int position)
{
    return (long) position;
}

关于android - 修复recyclerview选中项的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39654862/

相关文章:

android - 谷歌验证器刮刮码

java - MaterialCalendarView 装饰器覆盖选定日期的颜色问题

java - 除非刷新,否则 RecyclerAdapter 不会加载数据

android - 在哪里使用 onSaveInstanceState 和 onRestoreInstanceState 方法?

android - 删除最后一项时 Recyclerview 崩溃。 NullPointerException : android. View .ViewGroup$LayoutParams android.view.View.getLayoutParams()

android - 如果在 nestedScrollView 内,RecyclerView 不回收

Android: ViewPager FragmentStatePagerAdapter 获取当前 View

android - 如何制作一个深度 fragment 以在屏幕上使用喷气背包导航和 BottomNavigationView 占据整个屏幕?

android - 在我的 android 应用程序中显示 PDF 文件

android - 按像素垂直滚动 Android 中的 RecyclerView