2017-06-22 51 views
1

我按照继续阅读的TextView像Facebook内部列表视图

Set Text View ellipsize and add view more at end

,并添加视图和多视图在ListView少item.But上滚动的问题开始,更多时而消失,所有的文本视图会自动扩展。如何解决此问题,请帮助。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (inflater == null) inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) 
     convertView = inflater.inflate(R.layout.feed_item, null); 

    if (imageLoader == null) 
     imageLoader = AppController.getInstance().getImageLoader(); 

    TextView name = (TextView) convertView.findViewById(R.id.name); 
    TextView timestamp = (TextView) convertView.findViewById(R.id.timestamp); 
    TextView statusMsg = (TextView) convertView.findViewById(R.id.txtStatusMsg); 
    TextView url = (TextView) convertView.findViewById(R.id.txtUrl); 
    NetworkImageView profilePic = (NetworkImageView) convertView.findViewById(R.id.profilePic); 
    FeedImageView feedImageView = (FeedImageView) convertView.findViewById(R.id.feedImage1); 
    FeedItem item = feedItems.get(position); 
    name.setText(item.getName()); 
    CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(Long.parseLong(item.getTimeStamp()), System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS); 
    timestamp.setText(timeAgo); 
    if (!TextUtils.isEmpty(item.getStatus())) { 
     ////This is TextView I want to expand 
     statusMsg.setText(item.getStatus()); 
     statusMsg.setVisibility(View.VISIBLE); 
     makeTextViewResizable(statusMsg, 3, "...More", true); 
    } else { 
     statusMsg.setVisibility(View.GONE); 
    } 

    if (item.getUrl() != null) { 
     url.setText(Html.fromHtml("<a href=\"" + item.getUrl() + "\">" 
       + item.getUrl() + "</a> ")); 
     url.setMovementMethod(LinkMovementMethod.getInstance()); 
     url.setVisibility(View.VISIBLE); 
    } else { 
     url.setVisibility(View.GONE); 
    } 

    // user profile pic 
    profilePic.setImageUrl(item.getProfilePic(), imageLoader); 

    // Feed image 
    if (item.getImge() != null) { 
     feedImageView.setImageUrl(item.getImge(), imageLoader); 
     feedImageView.setVisibility(View.VISIBLE); 
     feedImageView 
       .setResponseObserver(new FeedImageView.ResponseObserver() { 
        @Override 
        public void onError() { 
        } 

        @Override 
        public void onSuccess() { 
        } 
       }); 
    } else { 
     feedImageView.setVisibility(View.GONE); 
    } 

    return convertView; 
} 

public static void makeTextViewResizable(final TextView tv, final int maxLine, final String expandText, final boolean viewMore) { 
    if (tv.getTag() == null) { 
     tv.setTag(tv.getText()); 
    } 
    ViewTreeObserver vto = tv.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

     @SuppressWarnings("deprecation") 
     @Override 
     public void onGlobalLayout() { 
      ViewTreeObserver obs = tv.getViewTreeObserver(); 
      obs.removeGlobalOnLayoutListener(this); 
      if (maxLine == 0) { 
       int lineEndIndex = tv.getLayout().getLineEnd(0); 
       String text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText; 
       tv.setText(text); 
       tv.setMovementMethod(LinkMovementMethod.getInstance()); 
       tv.setText(addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, maxLine, expandText, viewMore), TextView.BufferType.SPANNABLE); 
       tv.setTextColor(Color.BLACK); 
      } else if (maxLine > 0 && tv.getLineCount() >= maxLine) { 
       int lineEndIndex = tv.getLayout().getLineEnd(maxLine - 1); 
       String text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText; 
       tv.setText(text); 
       tv.setMovementMethod(LinkMovementMethod.getInstance()); 
       tv.setText(addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, maxLine, expandText, viewMore), TextView.BufferType.SPANNABLE); 
       tv.setTextColor(Color.BLACK); 
      } else { 
       int lineEndIndex = tv.getLayout().getLineEnd(tv.getLayout().getLineCount() - 1); 
       String text = tv.getText().subSequence(0, lineEndIndex) + " " + expandText; 
       tv.setText(text); 
       tv.setMovementMethod(LinkMovementMethod.getInstance()); 
       tv.setText(addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, lineEndIndex, expandText, viewMore), TextView.BufferType.SPANNABLE); 
       tv.setTextColor(Color.BLACK); 
      } 
     } 
    }); 
} 

private static SpannableStringBuilder addClickablePartTextViewResizable(final Spanned strSpanned, final TextView tv, final int maxLine, final String spanableText, final boolean viewMore) { 
    String str = strSpanned.toString(); 
    SpannableStringBuilder ssb = new SpannableStringBuilder(strSpanned); 
    if (str.contains(spanableText)) { 
     ssb.setSpan(new MySpannable(false) { 

      @Override 
      public void onClick(View widget) { 
       if (viewMore) { 
        tv.setLayoutParams(tv.getLayoutParams()); 
        tv.setText(tv.getTag().toString(), TextView.BufferType.SPANNABLE); 
        tv.invalidate(); 
        makeTextViewResizable(tv, -1, "...Less", false); 
       } else { 
        tv.setLayoutParams(tv.getLayoutParams()); 
        tv.setText(tv.getTag().toString(), TextView.BufferType.SPANNABLE); 
        tv.invalidate(); 
        makeTextViewResizable(tv, 3, "...More", true); 
       } 
      } 
     }, str.indexOf(spanableText), str.indexOf(spanableText) + spanableText.length(), 0); 
    } 
    return ssb; 
} 
+0

我认为你不要在适配器中为每个新项目重置视图状态(展开) –

+0

我该怎么做? – avik

+0

,它取决于你的适配器的'getView'方法代码。 –

回答

0

下面的解决方案将添加查看更多选项,如果文本的长度大于150,将ellipsize文本上查看150 characters.On点击更多,它会显示与显示更少的选择和点击显示不完整的文本再次将文本椭圆化为150个字符。它与循环查看项目的文本视图效果很好,并且应该与listview一起工作。

if(inputText.length()>150) 
     { 
      String text=inputText.substring(0,150)+"..."; 
      final String fulltext=inputText; 

      final SpannableString ss = new SpannableString(text+"View More"); 

      ClickableSpan span1 = new ClickableSpan() { 
       @Override 
       public void onClick(View textView) { 
        // do some thing 
        SpannableString ss1 = new SpannableString(fulltext+"Show Less"); 
        ClickableSpan span2 = new ClickableSpan() { 
         @Override 
         public void onClick(View textView) { 
          // do some thing 
          textView.setText(ss); 
          textView.setMovementMethod(LinkMovementMethod.getInstance()); 

         } 
        }; 
        ss1.setSpan(span2, fulltext.length(), ss1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
        ss1.setSpan(new ForegroundColorSpan(Color.BLUE), fulltext.length(), ss1.length(), 
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 


        textView.setText(ss1); 
        textView.setMovementMethod(LinkMovementMethod.getInstance()); 
       } 
      }; 
      ss.setSpan(span1, 153, 162, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
      ss.setSpan(new ForegroundColorSpan(Color.BLUE), 153,162, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

      textView.setText(ss); 
      textView.setMovementMethod(LinkMovementMethod.getInstance()); 
     } 
else 
     { 
      textView.setText(inputText); 
     }