如何解决处理onBindViewholder的复杂性
我正在编写一个联系人程序。我使用RecyclerView来显示联系人。我实现了onBindViewHolder函数。 但是问题在于,视图持有者拥有的信息越多,处理onBindViewholder的难度就越大。 例如,在我的程序中,首先会看到一个联系人列表,并且每次您单击这些联系人时,都会看到该用户的详细信息。 问题是,为了在每次循环使用联系信息后都不会消失,我必须保存这些情况,并再次告知onBindViewholder以显示联系详细信息。现在,这些情况越多,它们的多样性就越多,它们很难处理,并且可能会发生许多错误。有办法减少这些问题吗?
这是我的myAdapter代码
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.TestHolder> {
MainActivity mainActivity;
linearlayoutmanager linearlayoutmanager;
public List<HolderState> conditions;
OnBackpressedCallback onBackpressedCallbackforSelection;
int openID = -1;
private boolean onSelection = false;
public TestAdapter(final MainActivity mainActivity,JSONArray contactsList,ActivityCompat.OnRequestPermissionsResultCallback onRequestPermissionsResultCallback,final linearlayoutmanager linearlayoutmanager) {
super();
this.linearlayoutmanager = linearlayoutmanager;
this.mainActivity = mainActivity;
conditions = new ArrayList<>();
for (int i = 0; i < 3; i++) {
HolderState holderState = new HolderState();
holderState.DetailVisibility = HolderState.gone;
conditions.add(holderState);
}
onBackpressedCallbackforSelection = new OnBackpressedCallback(false) {
@Override
public void handleOnBackpressed() {
onSelection = false;
notifyDataSetChanged();
}
};
mainActivity.getonBackpresseddispatcher().addCallback(mainActivity,onBackpressedCallbackforSelection);
mainActivity.addContactBtn.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mainActivity.addContactBtn.setRotation(0f);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mainActivity.addContactBtn,"rotation",90f);
objectAnimator.setDuration(200);
objectAnimator.start();
HolderState holderState = new HolderState();
holderState.DetailVisibility = HolderState.gone;
conditions.add(holderState);
notifyItemInserted(conditions.size() - 1);
linearlayoutmanager.scrollToPositionWithOffset(conditions.size() - 1,10);
}
});
mainActivity.removeContactsBtn.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
removeSelectedContacts();
if(conditions.size()==0){
mainActivity.allSelection.setChecked(false);
onBackpressedCallbackforSelection.setEnabled(false);
onSelection=false;
ondeselectionFunction();
}
}
});
mainActivity.allSelection.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mainActivity.allSelection.isChecked())
for (int i = 0; i < conditions.size(); i++)
conditions.get(i).isChecked = true;
else {
for (int i = 0; i < conditions.size(); i++)
conditions.get(i).isChecked = false;
}
notifyDataSetChanged();
}
});
}
private void removeSelectedContacts() {
for (int i = conditions.size() - 1; i >= 0; i--)
if (conditions.get(i).isChecked) {
conditions.remove(i);
notifyItemRemoved(i);
}
notifyItemRangeChanged(0,conditions.size());
Log.i("TAG-remove","removeSelectedContacts: " + conditions.size());
}
@NonNull
@Override
public TestHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.contacts_template,parent,false);
return new TestHolder(view);
}
@Override
public void onBindViewHolder(@NonNull TestHolder holder,int position) {
holder.position = position;
if (onSelection) {
onSelectionFunction(holder,position);
} else {
ondeselectionFunction(holder,position);
}
//ContactDetaliVisibility
if (conditions.get(position).DetailVisibility == View.VISIBLE) {
holder.contactDetail.setVisibility(View.VISIBLE);
} else {
holder.contactDetail.setVisibility(View.GONE);
}
}
public void onSelectionFunction(final TestHolder holder,int position){
holder.selectContact.setVisibility(View.VISIBLE);
holder.selectContact.setChecked(conditions.get(position).isChecked);
onSelectionFunction();
}
public void onSelectionFunction(){
mainActivity.removeCardView.setVisibility(View.VISIBLE);
mainActivity.addContactBtn.setVisibility(View.GONE);
onBackpressedCallbackforSelection.setEnabled(onSelection);
}
public void ondeselectionFunction(final TestHolder holder,int position){
holder.selectContact.setVisibility(View.GONE);
holder.selectContact.setChecked(false);
ondeselectionFunction();
}
public void ondeselectionFunction(){
mainActivity.removeCardView.setVisibility(View.GONE);
mainActivity.addContactBtn.setVisibility(View.VISIBLE);
onBackpressedCallbackforSelection.setEnabled(onSelection);
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public int getItemCount() {
return conditions.size();
}
public class TestHolder extends RecyclerView.ViewHolder {
int position;
CheckBox selectContact;
LinearLayout contactDetail;
LinearLayout contactNameLayout;
public TestHolder(@NonNull View itemView) {
super(itemView);
configureView(itemView);
setViewListeners();
}
private void setViewListeners() {
contactNameLayout.setonLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
if (onSelection == false) {
onSelection = true;
if (openID != -1) {
conditions.get(openID).DetailVisibility = View.GONE;
openID = -1;
}
} else
onSelection = false;
notifyDataSetChanged();
return true;
}
});
contactNameLayout.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onSelection) {
if (selectContact.isChecked()) {
selectContact.setChecked(false);
} else {
selectContact.setChecked(true);
}
} else {
if (conditions.get(position).DetailVisibility == View.GONE) {
if (openID != -1) {
conditions.get(openID).DetailVisibility = View.GONE;
notifyItemChanged(openID);
}
conditions.get(position).DetailVisibility = View.VISIBLE;
openID = position;
} else {
conditions.get(position).DetailVisibility = View.GONE;
}
notifyItemChanged(position);
}
}
});
selectContact.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mainActivity.allSelection.isChecked()) {
mainActivity.allSelection.setChecked(false);
}
}
});
selectContact.setonCheckedchangelistener(new CompoundButton.OnCheckedchangelistener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton,boolean b) {
Log.i("TAGt","onCheckedChanged: " + position);
conditions.get(position).isChecked = b;
}
});
}
private void configureView(View itemView) {
contactNameLayout = itemView.findViewById(R.id.contact_name_layout);
contactDetail = itemView.findViewById(R.id.contact_phoneNumber);
selectContact = itemView.findViewById(R.id.check_Box);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。