将焦点设置在RecyclerView项目上。

7

我想要将焦点设置在特定的RecyclerView项上。 我尝试过

recyclerView.scrollToPosition(1);

在我的initializeRecyclerView方法中,我也尝试了
holder.setSelected(selectedItem==position)

没有成功。

你能帮我吗?

这是我的适配器:

 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.radio_item, parent, false);
    return new ViewHolder(v);
}

/**
 * Set the properties of a RecyclerView item
 * @param holder RecyclerView item
 * @param position Position of the item in the items list
 */
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    Radio radio = radios.get(position);
    holder.radio = radio;
    ImageHelper.setImage(context, holder.imageButton, radio.getLogoPath(), context.getDrawable(Const.DEFAULT_RADIO_LOGO_DRAWABLE) );
    holder.imageButton.setBackground(context.getDrawable(R.drawable.button));
    holder.imageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(clickListener != null){
                clickListener.onRadioClick(holder.getAdapterPosition());
            }
        }
    });
}
public class ViewHolder extends RecyclerView.ViewHolder{
    private ImageButton imageButton;
    public Radio radio;

    private ViewHolder(View itemView) {
        super(itemView);
        imageButton = itemView.findViewById(R.id.radioButton);
    }
}

在我的Fragment中:
if(getView()!=null){
        RadiosAdapter recyclerAdapter = new RadiosAdapter(radios, getActivity());
        RecyclerView recyclerView = getView().findViewById(R.id.radios_recycler);
        recyclerView.setAdapter(recyclerAdapter);

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), columnNumber, LinearLayoutManager.VERTICAL, false));
        if(currentRadio !=null){
            recyclerView.scrollToPosition(currentRadio.getPosition());
        }
        else{
            recyclerView.scrollToPosition(1);
        }

        if(getActivity() != null && getActivity() instanceof OnClickListener){
            OnClickListener listener = (OnClickListener)getActivity();
            recyclerAdapter.setClickListener(listener);
        }
    }

感谢!
2个回答

6

使用requestFocus()可能会解决您的问题。 但如果不行,我通过以下方式解决了同样类型的问题:

adapter中,我重写了OnViewAttachedToWindow()方法,并在其中调用requestFocus(),当ViewHolder匹配项目时。

参考 - https://dev59.com/YJTfa4cB1Zd3GeqPQWzE#41232962


0
在onBindViewHolder中调用也对我有用,例如如果你想要聚焦在第一个项目上。
override fun onBindViewHolder(holder: PodcastTvViewHolder, position: Int){
    if (position == 0) holder.itemView.requestFocus()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接