问题描述
我正在尝试制作一个基于ChipP&的Recyclerview过滤器.芯片
I'm trying to make a recyclerview filter based ChipGroup & Chip
我在我的应用程序上使用片段,因此,包含RecyclerView的片段包含一个将ChipGroup过滤器片段充气的frameLayout
I'm use fragment on my app, so, the fragment who contain the RecyclerView contain a frameLayout who inflate the ChipGroup filter fragment
当用户取消选择ChipGroup内的所有芯片时,我正在尝试触发侦听器(我已经将侦听器放在芯片上,以便在用户检查芯片时触发)
I'm trying to trigger a listener when the user unselect all chip inside ChipGroup (I've already put listener on chip for trigger when chip are checked by user)
我已经在芯片组上放置了一些侦听器,但是没有人触发
I've already put some listener on chipgroup but no one are trigered
FilterFragment.java
FilterFragment.java
public class FilterFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
public ChipGroup chipGroup;
// TODO: Rename and change types of parameters
public View.OnClickListener chipClickListener;
private OnFragmentInteractionListener mListener;
public FilterFragment() {
// Required empty public constructor
}
public static FilterFragment newInstance(View.OnClickListener
param1) {
CoachFilterFragment fragment = new CoachFilterFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_filter,
container, false);
this.chipGroup = view.findViewById(R.id.chipGroup);
for(Skill skill : ((MainActivity)getContext()).api.skills){
Chip chip = new Chip(getContext());
chip.setId(skill.getId());
chip.setText(skill.getName());
chip.setOnClickListener(chipClickListener);
chip.setCheckable(true);
chipGroup.addView(chip);
}
chipGroup.setOnCheckedChangeListener((chipGroup, id) -> {
Log.d("test","ok");
});
return view;
}
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
FilterFragment.xml
FilterFragment.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".Fragment.FilterFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</com.google.android.material.chip.ChipGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
有人知道为什么我的ChipGroup不触发任何侦听器?也许我缺少某些参数或某些东西?
Someone have any idea why any listener are not triggered by my ChipGroup?Maybe I'm missing some parameter or something?
推荐答案
您的代码很好,唯一的问题是setOnCheckedChangeListener()
仅在您的 ChipGroup
用于
Your code is fine the only issue is that setOnCheckedChangeListener()
only work when your ChipGroup
is for singleSelection
阅读 ChipGroup
Read this documentation of ChipGroup
- 注册一个回调,以便在该组中检查的芯片发生更改时调用.
- 此回调仅在单一选择模式.
也请阅读
调用setOnCheckedChangeListener(OnCheckedChangeListener)来注册一个回调,当该组中已检查的芯片发生更改时将调用该回调.此回调仅在单选模式下调用.
Call setOnCheckedChangeListener(OnCheckedChangeListener) to register a callback to be invoked when the checked chip changes in this group. This callback is only invoked in single selection mode.
如果要使用ChipGroup
的setOnCheckedChangeListener()
,则需要制作app:singleSelection="true"
if you want use setOnCheckedChangeListener()
of ChipGroup
than you need to make app:singleSelection="true"
用于在ChipGroup
SAMPLE CODE for maintain selection in ChipGroup
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
>
</com.google.android.material.chip.ChipGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
<Button
android:layout_width="match_parent"
android:text="Get Result"
android:id="@+id/btnShowResult"
android:layout_gravity="bottom"
android:layout_height="wrap_content" />
</LinearLayout>
public class Main3Activity extends AppCompatActivity {
public ChipGroup chipGroup;
public Button btnShowResult;
public ArrayList<Boolean> booleanArrayList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
chipGroup = findViewById(R.id.chipGroup);
btnShowResult = findViewById(R.id.btnShowResult);
btnShowResult.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (int i = 0; i < booleanArrayList.size(); i++) {
Log.e("RESULT", i + " :" + booleanArrayList.get(i));
}
}
});
for (int i = 0; i < 5; i++) {
Chip chip = new Chip(this);
chip.setId(i);
chip.setTag(i);
booleanArrayList.add(false);
chip.setText("Chip No : " + i);
chip.setCheckable(true);
chip.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
int tag = (int) compoundButton.getTag();
booleanArrayList.set(tag, b);
}
});
chipGroup.addView(chip);
}
chipGroup.invalidate();
chipGroup.setOnCheckedChangeListener(new ChipGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(ChipGroup chipGroup, int i) {
Chip chip = chipGroup.findViewById(i);
if (chip != null)
Toast.makeText(getApplicationContext(), "Chip is " + chip.getText().toString(), Toast.LENGTH_SHORT).show();
Log.e("OnCheckedChangeListener", "Called");
}
});
}
ChipGroup.OnCheckedChangeListener onCheckedChangeListener = new ChipGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(ChipGroup chipGroup, int i) {
}
};
}
有关更多信息,请查看以下文章
For more information please check below articles
- Chips: Material Components for Android
- Android P: Chips and ChipGroup
- Exploring the v28 Android Design Support Library Additions
这篇关于芯片组OnCheckedChangeListener()未触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!