2017-12-14 16 views
-1

3行目のテキストの最後に "..more"を追加し、さらにクリックするとポップアップ(またはカスタムダイアログ)にフルテキストを表示します。だから私はこの機能のために以下のコードを使った。あなたがポートレートモードになっているときにコードは正常に機能していますが、デバイスの向きを変更すると機能しません。そして私はBaseAdapterとRecyclerViewを(ViewHelperデザインパターンを使って)使用しています。3行後にtextviewの最後に "View More"を追加してダイアログに全文を表示する(ポップアップ)

public interface ViewMoreClickListener { 
    void viewMoreClicked(int index); 
} 

public void addViewMoreToTextView(final int position, final TextView tv, final String expandText, final int maxLine, final ViewMoreClickListener listener) { 
    try { 
     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); 

       String text = tv.getText().toString(); 

       if (tv.getLineCount() > maxLine) { 
        int lineEndIndex = tv.getLayout().getLineEnd(maxLine - 1); 
        text = text.subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText; 
        tv.setText(text); 

        // We are rechecking in order to resolve issue with alignment problem 
        if (tv.getLineCount() > maxLine) { 
         lineEndIndex = tv.getLayout().getLineEnd(maxLine - 1); 
         text = text.subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText; 
         tv.setText(text); 
        } 

        tv.setMovementMethod(LinkMovementMethod.getInstance()); 

        String str = Html.fromHtml(text).toString(); 
        SpannableStringBuilder ssb = new SpannableStringBuilder(Html.fromHtml(text)); 

        if (str.contains(expandText)) { 
         ssb.setSpan(new ClickableSpan() { 
          @Override 
          public void onClick(View widget) { 
           if (listener != null) 
            listener.viewMoreClicked(position); 
          } 
         }, str.indexOf(expandText), str.indexOf(expandText) + expandText.length(), 0); 
        } 

        tv.setText(ssb); 
       } 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public class SampleActivity extends BaseActivity implements ViewMoreClickListener { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public void viewMoreClicked(int index) { 
     // here we will show full text in pop up or custom dialog by getting from arraylist based on index. 
    } 
} 

そして、上記のメソッドをアダプタのgetView()から呼び出しています。

addViewMoreToTextView(position, textview, "..more", 3, listener); 

私はこれらのリンクを徹底的に守りましたが、RecyclerViewでも動作していません。

Set Text View ellipsize and add view more at end

Add "View More" at the end of textview after 3 lines

この問題を解決するために私を助けてください。私はコードの下に使用してこの問題を解決した

+0

は、[この回答](https://stackoverflow.com/a/18667717/4168607)を見てみましょう。私はこれがあなたが必要とするものだと思います。 – ADM

+0

@ADMご回答いただきありがとうございます。私はそのリンクを通過しましたが、そこにはないに基づいてトリミングテキストがあります。しかし、我々はnoに基づいて必要とする。ラインの。私はそれが私の必要条件を満たさないと思う。私のコードは、オリエンテーションを変えて、RecyclerViewでのみ動作しています。 –

答えて

0

public void addViewMoreToTextView(final int position, final TextView textView, final String text, final String expandText, final int maxLine, final ViewMoreClickListener listener) { 
    try { 
     textView.post(new Runnable() { 
      @Override 
      public void run() { 
       SpannableStringBuilder truncatedSpannableString; 
       int startIndex; 

       if (textView.getLineCount() > maxLine) { 
        int lastCharShown = textView.getLayout().getLineVisibleEnd(maxLine - 1); 
        String displayText = text.substring(0, lastCharShown - expandText.length() + 1) + " " + expandText; 
        startIndex = displayText.indexOf(expandText); 

        truncatedSpannableString = new SpannableStringBuilder(displayText); 

        textView.setText(truncatedSpannableString); 

        truncatedSpannableString.setSpan(new ClickableSpan() { 
         @Override 
         public void onClick(View widget) { 
          // this click event is not firing that's why we are adding click event for text view below. 
         } 
        }, startIndex, startIndex + expandText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

        textView.setText(truncatedSpannableString); 

        textView.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          if (listener != null) 
           listener.viewMoreClicked(position); 
         } 
        }); 

       } 
      } 
     }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
関連する問題