2017-06-22 4 views
1

IWeiter wie Facebook in Textview innerhalb Listview Lesen

Set Text View ellipsize and add view more at end

und fügte hinzu, die mehr Ansicht gefolgt und sehen weniger in der Listenansicht item.but das Problem auf eine Rolle beginnt, mehr manchmal verschwindet und die ganze Textansicht wird automatisch erweitert.Wie kann ich das beheben, bitte helfen.

@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

Ich denke, dass Sie –

+0

für jeden neuen Artikel in Ihrem Adapter nicht einen Zustand der Ansicht (erweitert) zurückgesetzt Wie kann ich das tun? – avik

+0

das hängt von Ihrem "getView" Methodencode Ihres Adapters ab. –

Antwort

0

Below Lösung Mehr anzeigen Option hinzufügen, wenn Textlänge größer als 150 ist und wird ellipsize Mehr um den Text zu 150 characters.On Klicken auf Ansicht wird es vollständigen Text mit anzeigen Weniger Option zeigen und klicken Sie auf anzeigen Weniger wieder wird es den Text zu 150 Zeichen ellipsize.Es funktioniert gut mit Textansicht recyclerview item und sollte auch mit listview arbeiten.

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); 
     } 
Verwandte Themen