gpt4 book ai didi

java - 从 RecyclerView 适配器到主脚本的 getSelectedButtonID 的未更新值

转载 作者:行者123 更新时间:2023-12-01 19:22:17 26 4
gpt4 key购买 nike

我有一个显示两个 View 的 recyclerView。我希望第二个 View 的文本根据第一个 View 中所选的 Material 按钮而变化。有点像选项卡系统,但没有选项卡和 fragment 。到目前为止,recyclerView 适配器通过一个接口(interface)发送,我觉得与应用程序相同的 ID 只能检测到我何时触摸切换组的第一个按钮,而不能检测到其他按钮。它不会更新所选按钮的 ID。现在,我真的不知道自己失败在哪里。

是因为适配器没有更新吗?我尝试在 getTabs() 函数中更新它,但无法调用adapter.notifyDataChanged(),因为“adapter”属于 createRecyclerView() 函数。

我尝试在 onBindViewHolder 方法中调用 onClick 方法,但无法将所选按钮 ID 设置为togglegroupID(基于“getSelectedButtonID”),因为 itemview 不是 onBindViewHolder 函数的一部分。

我已经阅读了我的代码很多次了,但找不到错误......

我的 RecyclerView 适配器脚本:

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

\...
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
MaterialButtonToggleGroup Tabs;
MaterialButton Prn_Btn;
OnButtonListener onButtonListener;
public ViewHolder(@NonNull View itemView, final OnButtonListener onButtonListener) {
super(itemView);
Tabs = itemView.findViewById(R.id.toggleGroup);
this.onButtonListener = onButtonListener;
int toggleGroupID = Tabs.getCheckedButtonId();
Prn_Btn = itemView.findViewById(toggleGroupID);
itemView.setOnClickListener(this);

Prn_Btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onButtonListener != null){
int position = getAdapterPosition();
int ID = Prn_Btn.getId();
onButtonListener.ontabClick(position, ID);
}
}
});

}

public interface OnButtonListener{
void onButtonClick (int position);
void ontabClick(int position, int ID);
}

}

我的主要代码:

public class act_main extends AppCompatActivity implements act_main_recycler_adapter.OnButtonListener{


private ArrayList<String> Texts = new ArrayList<>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lyt_act_main);
Texts.add("+65.1");
createRecyclerView();
}
private void createRecyclerView(){
RecyclerView recyclerView = findViewById(R.id.Recycler_View);
act_main_recycler_adapter adapter = new act_main_recycler_adapter(this, Texts,this );
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
private void getTabs(int ID){
switch (ID){
case R.id.principale:
Texts.set(0, "+65.1");
Toast.makeText(this,"Principales" ,Toast.LENGTH_SHORT ).show();
break;
case R.id.audio:
Texts.set(0, "+21.5");
Toast.makeText(this,"Audio" ,Toast.LENGTH_SHORT ).show();
break;
case R.id.visuels:
Texts.set(0, "39.5");
Toast.makeText(this,"Visuels" ,Toast.LENGTH_SHORT ).show();
break;
default:
Texts.set(0, "Paramètres");
Toast.makeText(this,"Paramètres" ,Toast.LENGTH_SHORT ).show();
}
}
@Override
public void ontabClick(int position, int ID) {
getTabs(ID);
}
}

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="65dp"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:padding="5dp">

<com.google.android.material.button.MaterialButtonToggleGroup
android:id="@+id/toggleGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:paddingTop="10dp"
app:checkedButton="@+id/principale"
app:singleSelection="true">

<com.google.android.material.button.MaterialButton
android:id="@+id/principale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Principale"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:textColor="@color/textColor"
app:cornerRadius="5dp"
app:elevation="5dp" />

<com.google.android.material.button.MaterialButton
android:id="@+id/audio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Audio"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:textColor="@color/textColor"
app:cornerRadius="5dp"
app:elevation="5dp" />

<com.google.android.material.button.MaterialButton
android:id="@+id/visuels"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Visuels"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:textColor="@color/textColor"
app:cornerRadius="5dp"
app:elevation="5dp" />
</com.google.android.material.button.MaterialButtonToggleGroup>

</RelativeLayout>

现在, getTabs() 函数中唯一起作用的是第一种情况,因为 Toast 消息“Principales”正确显示在应用程序上。这与其他情况不同,没有显示任何内容。

我该如何解决这个问题?由于无法在 createRecyclerView() 函数之外调用 adapter.notifyDataChanged(),如何更新第二个 View 的文本。

最佳答案

找到了解决方案。您必须向切换组添加一个监听器并从那里开始工作,而不是使用 Tabs.getCheckedId (完全有效)并调用按钮(由于您无法更新它,该按钮将保持相同的按钮)。修改后的代码如下所示。

将 ViewHolder 更改为:

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
MaterialButtonToggleGroup Tabs;
MaterialButton Prn_Btn;
OnButtonListener onButtonListener;
public ViewHolder(@NonNull View itemView, final OnButtonListener onButtonListener) {
super(itemView);
Tabs = itemView.findViewById(R.id.toggleGroup);
this.onButtonListener = onButtonListener;
int toggleGroupID = Tabs.getCheckedButtonId();
Prn_Btn = itemView.findViewById(toggleGroupID);
itemView.setOnClickListener(this);

Tabs.addOnButtonCheckedListener(new MaterialButtonToggleGroup.OnButtonCheckedListener() {
@Override
public void onButtonChecked(MaterialButtonToggleGroup group, int checkedId, boolean isChecked) {
if (onButtonListener != null){
if (isChecked){
int position = getAdapterPosition();
onButtonListener.ontabClick(position, checkedId);
}
if (Tabs.getCheckedButtonId() == -1){
int position = getAdapterPosition();
onButtonListener.ontabClick(position, -1);
}
}
}
});
}

关于java - 从 RecyclerView 适配器到主脚本的 getSelectedButtonID 的未更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59345644/

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