微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

处理onBindViewholder的复杂性

如何解决处理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 举报,一经查实,本站将立刻删除。