gpt4 book ai didi

android - OnClick 在 TextInputLayout 内的 EditText 中,在 RecyclerView 内

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:21 36 4
gpt4 key购买 nike

我的 Fragment 中有一个 RecyclerView,其中填充了多个 TextInputLayout。经过一些研究,我设法为 TextInputLayout 设置了一个 onClickListener,并且可以正常工作

但是

仅当我点击 TextInputLayout 的提示时才会触发 onClick 事件。当我点击 TextInputLayout 内的 EditText 时,我希望它被触发。

代码:

在我的 fragment 中:

adapter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("Logging", "Element: "+rView.getChildAdapterPosition(v));//rView is RecyclerView

RelativeLayout rel=(RelativeLayout)v;
TextInputLayout til=(TextInputLayout) rel.getChildAt(0);
EditText editText=til.getEditText();
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}

@Override
public void afterTextChanged(Editable s) {
Log.i("Logging", "afterTextChanged called");
}
});

}
});

RecyclerView 中每个“行”的 XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">

<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textInputLayout">

<EditText
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</android.support.design.widget.TextInputLayout>
</RelativeLayout>

这就是我在适配器中设置监听器的方式:

public class IuAdapter extends RecyclerView.Adapter<IuAdapter.ViewHolder> implements View.OnClickListener{

private ArrayList<Model> datos;
private View.OnClickListener listener;

public IuAdapter(ArrayList<Model> datos) {
this.datos = datos;
}

@Override
public void onClick(View v) {
if(listener != null){

listener.onClick(v);
}else{
//Some logging
}

}

public void setOnClickListener(View.OnClickListener listener) {
this.listener = listener;
}

@Override
public IuAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.rowlayout, parent, false);

itemView.setOnClickListener(this);
ViewHolder holder=new ViewHolder(itemView);
return holder;

}

@Override
public void onBindViewHolder(IuAdapter.ViewHolder holder, int position) {
Model item=datos.get(position);

holder.colocarModelo(item);
}

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

public static class ViewHolder extends RecyclerView.ViewHolder{

private TextInputLayout textInputLayout;

public ViewHolder(View itemView) {
super(itemView);
textInputLayout=(TextInputLayout)itemView.findViewById(R.id.textInputLayout);
}

private void colocarModelo(Model model){
textInputLayout.setHint(model.getHint());
textInputLayout.getEditText().setText(model.getValor());
}

}
}

如您所见,我需要在 TextInputLayout 内的 EditText 中更改文本后进行一些处理。当我点击提示时,afterTextChanged 方法被触发。但是要触发 onClick,正如我所说,我需要单击 TextInputLayout 的提示,并且当我简单地单击里面的 EditText 时不会触发。我想实现这一目标。

我尝试过的:

我试图直接在 EditText 上设置 onClickListener,但出现异常。

有没有办法实现我想要的?

谢谢。

编辑:

根据要求,当我在 TextInputLayout 内的 EditText 上添加 onClickListener 时出现异常:

java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v7.widget.RecyclerView$LayoutParams
at android.support.v7.widget.RecyclerView.getChildViewHolderInt(RecyclerView.java:3381)
at android.support.v7.widget.RecyclerView.getChildAdapterPosition(RecyclerView.java:3400)
at es.infaplic.gibmov.Fragmentos.IU.GeneralIuFragment$1.onClick(GeneralIuFragment.java:138)
at es.infaplic.gibmov.Adapters.IuAdapter.onClick(IuAdapter.java:33)
at android.view.View.performClick(View.java:4569)
at android.view.View$PerformClick.run(View.java:18553)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5212)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)

为此,我在适配器内的 onCreateViewHolder 方法中进行了以下更改:

public IuAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

/*View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.rowlayout, parent, false);

itemView.setOnClickListener(this);
ViewHolder holder=new ViewHolder(itemView);*/
RelativeLayout itemView=(RelativeLayout)LayoutInflater.from(parent.getContext())
.inflate(R.layout.rowlayout, parent, false);
TextInputLayout til=(TextInputLayout)itemView.getChildAt(0);
EditText editText=til.getEditText();
editText.setOnClickListener(this);
ViewHolder holder=new ViewHolder(itemView);
return holder;

}

更新:

如果我改变 ViewHolder holder=new ViewHolder(itemView);至 ViewHolder holder=new ViewHolder(til);

我收到另一种异常:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:3562)
at android.view.ViewGroup.addView(ViewGroup.java:3415)
at android.view.ViewGroup.addView(ViewGroup.java:3360)
at android.support.v7.widget.RecyclerView$4.addView(RecyclerView.java:538)
at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:83)
at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:6079)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:6037)
at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:6025)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1378)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1327)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:556)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2713)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3011)
at android.view.View.layout(View.java:14948)
at android.view.ViewGroup.layout(ViewGroup.java:4631)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
at android.view.View.layout(View.java:14948)
at android.view.ViewGroup.layout(ViewGroup.java:4631)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1627)
at android.view.View.layout(View.java:14948)
at android.view.ViewGroup.layout(ViewGroup.java:4631)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
at android.view.View.layout(View.java:14948)
at android.view.ViewGroup.layout(ViewGroup.java:4631)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
at android.view.View.layout(View.java:14948)
at android.view.ViewGroup.layout(ViewGroup.java:4631)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
at android.view.View.layout(View.java:14948)
at android.view.ViewGroup.layout(ViewGroup.java:4631)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
at android.view.View.layout(View.java:14948)
at android.view.ViewGroup.layout(ViewGroup.java:4631)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1991)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1748)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5703)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:544)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5212)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)

最佳答案

问题出在这一行:

TextInputLayout til=(TextInputLayout) rel.getChildAt(0);

在你的 fragment 中。 TextInputLayout 不是 RelativeLayout 的直接子级。尝试将其更改为:

TextInputLayout til=(TextInputLayout)rel.findViewById(R.id.textInputLayout);

关于android - OnClick 在 TextInputLayout 内的 EditText 中,在 RecyclerView 内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38012512/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com