【问题标题】:Auto focus EditText that sits inside RecyclerView adapter位于 RecyclerView 适配器内的自动对焦 EditText
【发布时间】:2022-08-06 00:38:30
【问题描述】:

我有一个片段,它有一个 RecyclerView。这个 RecyclerView 有一个 header 适配器,其中包含一个 EditText。

当 Fragment 出现时,我希望 EditText 自动聚焦(即自动显示键盘)。

我该怎么做?

片段:

public class My Fragment extends Fragment {

    private LinearLayoutManager layoutManager;

    private FeedRecyclerView recyclerView;

    private PostAdapter postAdapter;

    private ConcatAdapter concatAdapter;

    private HeaderAdapter headerAdapter;

    private List<Post> postData = new ArrayList<>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.my_fragment, parent, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        recyclerView = view.findViewById(R.id.recycler_view);

        layoutManager = new FeedLinearLayoutManager(getContext());

        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        // This is the adapter that contains the EditText
        headerAdapter = new HeaderAdapter(getContext());

        postAdapter = new PostAdapter(getContext(), postData, layoutManager);

        concatAdapter = new ConcatAdapter();
        recyclerView.setAdapter(concatAdapter);

        concatAdapter.addAdapter(searchHeaderAdapter);
    }
}

适配器类,HeaderAdapter:

public class HeaderAdapter extends RecyclerView.Adapter<HeaderAdapter.ViewHolder> {

    private Context context;

    public HeaderAdapter(Context context) {
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.my_header, parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        //
    }

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

    @Override
    public int getItemCount() {
        return 1;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public EditText myEditText;

        public ViewHolder(View v) {
            super(v);

            myEditText = v.findViewById(R.id.my_edit_text);
        }
    }

}

如您所见,我的 RecyclerView 的适配器 HeaderAdapter 具有 EditText。当显示片段时,我想自动聚焦这个 EditText。

我该怎么做?

谢谢

  • 为什么需要将 EditText 放在 RecyclerView 中?您可以在一个适配器中拥有多个布局。您可以将 EditText 放在 postAdapter 中,并使用 getItemViewType 来访问 viewholder,而不是只为 headet 使用两个适配器。
  • @AmadYus 现代标准是使用多个适配器,而不是将所有代码放在一个适配器类中

标签: android android-fragments android-recyclerview android-adapter


【解决方案1】:

将此行 myEditText.requestFocus() 添加到 Header ViewHolder 的 init 中

init {
    myEditText = v.findViewById(R.id.my_edit_text)
    myEditText.requestFocus()
}

【讨论】:

  • 刚试过,可惜没用
  • 我认为这个答案可能会奏效,但有些情况会阻止视图集中注意力。见View#requestFocus()。您可能需要等到字段具有大小并通过在仅布局侦听器的全局布局侦听器中执行此代码来进行布局。你也可以通过将`<requestFocus />`添加到编辑文本.
【解决方案2】:

尝试这个

    @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.myEditText.requestFocus();
        
 ((InputMethodManager)holder.itemView.context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(holder.myEditText, 0);
        }
    

【讨论】:

  • 不幸的是没有工作
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2017-09-23
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2018-01-23
相关资源
最近更新 更多