在ListView中的上下文中展开-Android

在ListView中的上下文中展开-Android,android,android-listview,textview,android-context,Android,Android Listview,Textview,Android Context,我有一个listView,行的一个组件是TextView。默认情况下,我希望在TextView中只显示2行文本。但是如果用户点击文本视图,我希望文本视图在上下文中展开 事实上,这部分工作正常,但我希望有一个内容更丰富的指标: 我当前的实现(如下)有自己的问题,如果滚动列表视图,它不会崩溃,但我将通过将每个游标记录的值存储在某个集合中来处理 我尝试使用chatbuble.getLineCount(),但最初它返回零b/c它没有经过onLayout(据我所知) 我只希望在内容超过2行时显示它 我想

我有一个listView,行的一个组件是TextView。默认情况下,我希望在TextView中只显示2行文本。但是如果用户点击文本视图,我希望文本视图在上下文中展开

事实上,这部分工作正常,但我希望有一个内容更丰富的指标:

我当前的实现(如下)有自己的问题,如果滚动列表视图,它不会崩溃,但我将通过将每个游标记录的值存储在某个集合中来处理

我尝试使用chatbuble.getLineCount(),但最初它返回零b/c它没有经过onLayout(据我所知)

我只希望在内容超过2行时显示它

我想我的解决方案将是创建我自己的TextView实现,它可以处理我的一些需求,但不确定是否有人有我可以看的任何示例。。(或其他建议)

我想我的解决方案将是创建我自己的 TextView可以处理我的一些需求,但不确定是否 任何人都有我可以看的例子

请看下面的课程:

public class LimitedTextView extends TextView {

    private boolean mStatus;

    public LimitedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Paint p = getPaint();
        String s = getText().toString();
        if (s != null && !s.equals("")) {
            int m = (int) p.measureText(s);
            if (m < getMeasuredWidth() * 2) {
                modifyParent(true);
            } else {
                modifyParent(false);
            }
        }
    }

    private void modifyParent(boolean how) {
        RelativeLayout rl = (RelativeLayout) getParent();
        rl.findViewById(R.id.minimize_maximize).setVisibility(
                how ? View.GONE : View.VISIBLE);
        if (mStatus) {
            setMaxLines(40); // arbitrary number, set it as high as possible
        } else {
            setMaxLines(2);
        }
    }

    public void storeCurrentStatus(boolean status) {
        mStatus = status;
    }

}
  • 基于相同的
    mStatus
    布尔数组,您可能会更改
    ImageView
    的可绘制性,以显示不同的可绘制性,具体取决于
    TextView
    是否展开
  • 我是手工写的,所以可能有一些我现在遗漏的错误,把它当作一个想法。
    LimitedTextView
    可以在性能上得到改进,我也不知道如果您想为扩展文本设置动画,它的性能会有多好

    final TextView chatBubble = (TextView) view.getTag(R.id.chat_bubble);
            final ViewGroup expandableContainer = (ViewGroup) view.getTag(R.id.linear_layout_row_three);
            final ImageView minimizeMaximize = (ImageView) view.getTag(R.id.minimize_maximize);
            chatBubble.setOnClickListener(
    
                    new View.OnClickListener() {
                        boolean isExpanded = false;
                        int lastHeight = 0;
                        // This is for the auto expanding text view
                        @Override
                        public void onClick(View v) {
                            if (isExpanded) {
                                ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) expandableContainer
                                        .getLayoutParams();
    
                                params.height = lastHeight;
                                chatBubble.setMaxLines(2);
    
                                expandableContainer.setLayoutParams(params);
                                expandableContainer.invalidate();
                                minimizeMaximize.setVisibility(View.VISIBLE);
                            } else {
                                lastHeight = expandableContainer.getHeight();
    
                                ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) expandableContainer
                                        .getLayoutParams();
    
                                params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
                                chatBubble.setMaxLines(99);
    
                                expandableContainer.setLayoutParams(params);
                                expandableContainer.invalidate();
                                minimizeMaximize.setVisibility(View.VISIBLE);
                            }
    
                            isExpanded = !isExpanded;
    
                        }
                    });
    
    public class LimitedTextView extends TextView {
    
        private boolean mStatus;
    
        public LimitedTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            Paint p = getPaint();
            String s = getText().toString();
            if (s != null && !s.equals("")) {
                int m = (int) p.measureText(s);
                if (m < getMeasuredWidth() * 2) {
                    modifyParent(true);
                } else {
                    modifyParent(false);
                }
            }
        }
    
        private void modifyParent(boolean how) {
            RelativeLayout rl = (RelativeLayout) getParent();
            rl.findViewById(R.id.minimize_maximize).setVisibility(
                    how ? View.GONE : View.VISIBLE);
            if (mStatus) {
                setMaxLines(40); // arbitrary number, set it as high as possible
            } else {
                setMaxLines(2);
            }
        }
    
        public void storeCurrentStatus(boolean status) {
            mStatus = status;
        }
    
    }
    
    mStatus[(Integer) v.getTag()] = !mStatus[(Integer) v.getTag()];
    notifyDataSetChanged();