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