Android 在“回收器”视图中一次展开一个文本视图,并在单击其他视图时折叠展开的文本视图

Android 在“回收器”视图中一次展开一个文本视图,并在单击其他视图时折叠展开的文本视图,android,Android,我正在尝试展开和折叠RecyclerView中的文本视图,我可以轻松执行此任务,但要求一次展开一个文本视图,即如果展开RecyclerView中第一个位置的文本视图并单击第二个位置的文本视图,则第一个应该自动折叠。 以下是展开和折叠的方法: private void addReadMore(final String text, final TextView textView) { SpannableString ss = new SpannableString(text.substri

我正在尝试展开和折叠RecyclerView中的文本视图,我可以轻松执行此任务,但要求一次展开一个文本视图,即如果展开RecyclerView中第一个位置的文本视图并单击第二个位置的文本视图,则第一个应该自动折叠。 以下是展开和折叠的方法:

private void addReadMore(final String text, final TextView textView) {

    SpannableString ss = new SpannableString(text.substring(0, 280) + "... Read More");
    ClickableSpan clickableSpan = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            addReadLess(text, textView);
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                ds.setColor(ContextCompat.getColor(mContext, R.color.txt_color));
            } else {
                ds.setColor(ContextCompat.getColor(mContext, R.color.txt_color));
            }
        }
    };

    ss.setSpan(clickableSpan, ss.length() - 10, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(ss);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
}

private void addReadLess(final String text, final TextView textView) {


    SpannableString ss = new SpannableString(text + " Read Less");
    ClickableSpan clickableSpan = new ClickableSpan() {
        @Override
        public void onClick(View view) {
            addReadMore(text, textView);
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

                ds.setColor(ContextCompat.getColor(mContext, R.color.txt_color));

            } else {
                ds.setColor(ContextCompat.getColor(mContext, R.color.txt_color));

            }
        }
    };
    ss.setSpan(clickableSpan, ss.length() - 10, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    textView.setText(ss);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
}
请建议我如何一次只展开一个文本视图。
提前感谢。

您可以将扩展索引的值保留在变量中。 在展开视图的onClickListener中,调用
notifyDataSetChanged

创建一个全局变量(设为
int expandedIndex=-1
) 每次调用readmore或readless函数时,更新此变量并调用
notifyDataSetChanged

已编辑 注:
索引
是项目在适配器中的位置。 int expandedIndex=-1

void onBindViewHolder(){
 if(length>280 && position==-1){ //for first time, call read more } 

 else if(length<280&&position==-1){ //Call read less) } 

else { //Call read more when manual clicks are done on position }
}
private void addReadMore(final String text, final TextView textView) {
SpannableString ss = new SpannableString(text.substring(0, 280) + "... Read More");
}
ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(View widget) {
position=-1;
notifiyDatasetChanged()
        addReadLess(text, textView);
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setUnderlineText(false);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ds.setColor(ContextCompat.getColor(mContext, R.color.txt_color));
        } else {
            ds.setColor(ContextCompat.getColor(mContext, R.color.txt_color));
        }
    }
};

ss.setSpan(clickableSpan, ss.length() - 10, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(ss);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}

private void addReadLess(final String text, final TextView textView,int index) {


SpannableString ss = new SpannableString(text + " Read Less");
ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(View view) {
position=index;
notifiyDatasetChanged
        addReadMore(text, textView);
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setUnderlineText(false);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            ds.setColor(ContextCompat.getColor(mContext, R.color.txt_color));

        } else {
            ds.setColor(ContextCompat.getColor(mContext, R.color.txt_color));

        }
    }
};
ss.setSpan(clickableSpan, ss.length() - 10, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(ss);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
void onBindViewHolder(){
如果(length>280&&position==-1){//第一次,调用readmore}
else if(长度=Build.VERSION\u code.M){
setColor(ContextCompat.getColor(mContext,R.color.txt_color));
}否则{
setColor(ContextCompat.getColor(mContext,R.color.txt_color));
}
}
};
ss.setSpan(可点击SPAN,ss.length()-10,ss.length(),SPAN.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(ss);
setMovementMethod(LinkMovementMethod.getInstance());
}
私有void addReadLess(最终字符串文本、最终文本视图文本视图、int索引){
SpannableString ss=新的SpannableString(文本+少读“);
ClickableSpan ClickableSpan=新的ClickableSpan(){
@凌驾
公共void onClick(视图){
位置=索引;
notifiyDatasetChanged
addReadMore(文本、文本视图);
}
@凌驾
public void updateDrawState(TextPaint ds){
super.updateDrawState(ds);
ds.setUnderlineText(false);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
setColor(ContextCompat.getColor(mContext,R.color.txt_color));
}否则{
setColor(ContextCompat.getColor(mContext,R.color.txt_color));
}
}
};
ss.setSpan(可点击SPAN,ss.length()-10,ss.length(),SPAN.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(ss);
setMovementMethod(LinkMovementMethod.getInstance());
}

我没有处理特定的项目单击“让我显示代码部分”,其中在onBindViewHolder()中调用了方法-->txt=list_ada.get(position).getNewsDescE();如果(txt.length()>=280){addReadMore(txt,holder.news_des);}或者{holder.news_des.setText(list_ada.get(position.getNewsDescE());}您还需要保留另一个变量,以便关闭和打开视图。如果(length>280&&position==-1){//第一次调用readmore}您可以这样做,如果(length>280&&position=-1){//如果(length),对不起,我不能处理这个问题,请您发布您的逻辑。在addReadMore(text,textView)中;我将传递什么索引来调用addReadLess(final String text,final textView textView,int index)?从bindViewHolder参数的位置。