【发布时间】:2019-02-09 21:21:49
【问题描述】:
我实施了一个分段回收视图,效果很好。我想在显示在一个部分下的所有项目中包含一个复选框。我现在要实现的是允许用户一次检查一个复选框。我也尝试了单选按钮,但问题仍然存在,因为我无法抓住听众。
我在 stackoverflow 上搜索过它,但我无法让它工作。 getTag() 给了我一个空指针异常,我也尝试保留一个 selectedPosition 变量并尝试但我无法让 getTag() 工作。
public class HeaderRecyclerViewSection extends StatelessSection {
private static final String TAG = HeaderRecyclerViewSection.class.getSimpleName();
private String title;
private List<RestaurauntMenuItemDetail> list;
private List<RestaurauntMenuItemDetail> checkedList;
private int selectedPosition = -1;
public HeaderRecyclerViewSection(String title, List<RestaurauntMenuItemDetail> list) {
super(R.layout.section_ex1_header, R.layout.layout_section_item);
this.title = title;
this.list = list;
}
@Override
public int getContentItemsTotal() {
return list.size();
}
@Override
public RecyclerView.ViewHolder getItemViewHolder(View view) {
return new ItemViewHolder(view);
}
@Override
public void onBindItemViewHolder(RecyclerView.ViewHolder holder, final int position) {
final ItemViewHolder iHolder = (ItemViewHolder)holder;
iHolder.variationItemName.setText(list.get(position).getVariationItemName());
iHolder.variationItemPrice.setText(Double.toString(list.get(position).getVariationItemPrice()));
iHolder.checkBox.setOnCheckedChangeListener(null);
iHolder.checkBox.setChecked(list.get(position).isSelected());
Log.i("EXECUTED AGAIN","AGAIN");
iHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(selectedPosition == position){
list.get(selectedPosition).setSelected(false);
iHolder.checkBox.setChecked(list.get(selectedPosition).isSelected());
}
list.get(position).setSelected(b);
Log.i("POSITION is",Integer.toString(position));
Log.i("B Is",Boolean.toString(b));
selectedPosition = position;
}
});
}
@Override
public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
return new HeaderViewHolder(view);
}
@Override
public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
HeaderViewHolder hHolder = (HeaderViewHolder)holder;
hHolder.headerTitle.setText(title);
}
}
我的 ItemHolder 类:
public class ItemViewHolder extends RecyclerView.ViewHolder{
public TextView variationItemName;
public TextView variationItemPrice;
CheckBox checkBox;
public ItemViewHolder(View itemView) {
super(itemView);
variationItemName = (TextView) itemView.findViewById(R.id.variationItemName);
variationItemPrice = (TextView) itemView.findViewById(R.id.variationItemPrice);
checkBox = itemView.findViewById(R.id.checkBox2);
}
}
我想要实现的是让用户能够在某个部分下选择一个复选框。
编辑 1:
这是当前我的屏幕使用单选按钮或复选框时的外观。
编辑 2: 我更改了我的代码如下,这让我可以一次检查一个单选按钮。问题是,当您单击回收站视图列表中的最后一项时,单选按钮不会被选中,如果选中,那么当您向上滚动时,它就会消失。
@Override
public void onBindItemViewHolder(final RecyclerView.ViewHolder holder, final int position) {
final ItemViewHolder iHolder = (ItemViewHolder)holder;
iHolder.variationItemName.setText(list.get(position).getVariationItemName());
iHolder.variationItemPrice.setText(Double.toString(list.get(position).getVariationItemPrice()));
iHolder.variationItemPrice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("I WAS CLICKED","ITEM PRICE WAS CLICKED");
}
});
iHolder.radioButton.setChecked(list.get(position).isSelected());
iHolder.radioButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("I was pressed","BUtton");
RadioButton rb = (RadioButton) view;
if(rb.isChecked()){
Log.i("CONTAINS",Boolean.toString(radioButtonList.contains(rb)));
if(position >= radioButtonList.size()){
radioButtonList.add(rb);
rb.setChecked(true);
list.get(position).setSelected(true);
}else{
}
//list.get(position).setSelected(true);
}
for (int i = 0; i < radioButtonList.size(); i++) {
RadioButton nrb = radioButtonList.get(i);
if(i != position){
if(nrb.isChecked()){
nrb.setChecked(false);
list.get(i).setSelected(false);
}
}
}
Log.i("RADIO LIST",Integer.toString(radioButtonList.size()));
for (int i = 0; i < radioButtonList.size(); i++) {
Log.i("RADIO CHECKED",Boolean.toString(radioButtonList.get(i).isChecked()));
}
Log.i("CURRENT POST",Integer.toString(position));
for (int i = 0; i < list.size() ; i++) {
Log.i("POST",Boolean.toString(list.get(i).isSelected()));
}
}
});
}
我的活动课:
public class RestaurauntMenuItemDetailActivity extends AppCompatActivity implements RestaurauntMenuItemDetailInterfaceHandler{
private static List<RestaurauntMenuItemDetail> restaurauntMenuItemDetailList = new LinkedList<>();
RestaurauntMenuItemDetailFetchAPI restaurauntMenuItemDetailFetchAPI;
String restaurauntSlug;
String menuSlug;
int menuId;
int variationCount;
List<String> variationNamesList;
private RecyclerView sectionHeader;
private SectionedRecyclerViewAdapter sectionAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_restauraunt_menu_item_detail);
//
// sectionAdapter = new SectionedRecyclerViewAdapter();
restaurauntMenuItemDetailFetchAPI = new RestaurauntMenuItemDetailFetchAPI(this,this);
restaurauntSlug = getIntent().getExtras().getString("restaurauntSlug");
menuSlug = getIntent().getExtras().getString("menuSlug");
menuId = getIntent().getExtras().getInt("menuId");
restaurauntMenuItemDetailFetchAPI.prepareURL(restaurauntSlug,menuSlug,menuId);
restaurauntMenuItemDetailFetchAPI.fetchMenuItemDetail();
}
@Override
public void restaurauntMenuItemDetailListDownloadTaskCompleted(List<RestaurauntMenuItemDetail> result,int variationCount,List<String> variationNames) {
restaurauntMenuItemDetailList = result;
this.variationCount = variationCount;
variationNamesList = variationNames;
sectionHeader = (RecyclerView)findViewById(R.id.menuItemDetailRecyclerView);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(RestaurauntMenuItemDetailActivity.this);
sectionHeader.setLayoutManager(linearLayoutManager);
sectionHeader.setHasFixedSize(true);
// HeaderRecyclerViewSection secondSection = new HeaderRecyclerViewSection("Second Section", restaurauntMenuItemDetailList);
// HeaderRecyclerViewSection thirdSection = new HeaderRecyclerViewSection("Third Section", restaurauntMenuItemDetailList);
sectionAdapter = new SectionedRecyclerViewAdapter();
for(int i=0; i < variationNamesList.size(); i++){
String variationName = variationNames.get(i);
addSectionToAdapter(variationName,sectionAdapter);
sectionHeader.setAdapter(sectionAdapter);
}
// sectionAdapter.addSection(secondSection);
// sectionAdapter.addSection(thirdSection);
// initRecyclerView();
}
private void addSectionToAdapter(String variationName, SectionedRecyclerViewAdapter sectionAdapter){
List<RestaurauntMenuItemDetail> l1 = new ArrayList<>();
for (int i = 0; i < restaurauntMenuItemDetailList.size() ; i++) {
if(restaurauntMenuItemDetailList.get(i).getVariationCategory().equals(variationName)){
l1.add(restaurauntMenuItemDetailList.get(i));
}
}
HeaderRecyclerViewSection firstSection = new HeaderRecyclerViewSection(variationName, l1,sectionAdapter);
sectionAdapter.addSection(firstSection);
}
}
【问题讨论】:
-
嗯,是radio button 的经典领域“单选按钮允许用户从一组选项中选择一个选项。”。你可以让复选框做到这一点,请不要(混乱会占上风)。
-
@JonGoodwin 我已经更新了这个问题。看一下屏幕截图。您可以使用单选按钮想象相同的代码。我在复选框之前尝试过。我有一个带有单选按钮或复选框、项目名称和价格的单行。我可以默认选择所有我不想要的。
-
只需检查此答案,它可能会对您有所帮助。 stackoverflow.com/a/32428115/3669559
标签: android checkbox android-recyclerview sections