在android中,如果列表视图中的行超过2行,如何添加显示更多

在android中,如果列表视图中的行超过2行,如何添加显示更多,android,listview,button,row,Android,Listview,Button,Row,我是android新手。我在列表视图中有一个普通的文本视图作为列表项。如果一行有3行以上的文本,我必须在列表视图中向该行动态添加一个按钮 我已经尝试过android中的ViewTreeObserver和OnPreDrawListener函数。但它不起作用,因为只有在呈现所有列表项之后,才会调用ViewTreeObserver。因此,ViewTreeObserver仅在最后一项上被调用 请帮帮我!我有麻烦了 以下是我编写的代码: @Override public View getView(int

我是android新手。我在
列表视图
中有一个普通的
文本视图
作为列表项。如果一行有3行以上的文本,我必须在列表视图中向该行动态添加一个按钮

我已经尝试过android中的
ViewTreeObserver
OnPreDrawListener
函数。但它不起作用,因为只有在呈现所有列表项之后,才会调用
ViewTreeObserver
。因此,
ViewTreeObserver
仅在最后一项上被调用

请帮帮我!我有麻烦了

以下是我编写的代码:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{

    if (convertView == null)
    {
        convertView = inflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.review = (TextView) convertView.findViewById(R.id.text);
        convertView.setTag(holder);
        convertView1 = convertView;
    }
    holder = (ViewHolder) convertView.getTag();
    item = reviews.get(position);
    Log.d("position",""+position);
    holder.review.setText(item.getReview());
    mViewTreeObserver = holder.review.getViewTreeObserver();
    mViewTreeObserver.addOnPreDrawListener(onPreDrawListener);

    return convertView;
}

OnPreDrawListener onPreDrawListener = new OnPreDrawListener()
{

    @Override
    public boolean onPreDraw()
    {

        System.out.println("Line Count is : " + holder.review.getLineCount());
        noOfLines = holder.review.getLineCount();
        if (noOfLines > 3)
        {

            int lineEndIndex = holder.review.getLayout().getLineEnd(2);
            String text = holder.review.getText().subSequence(0, lineEndIndex - 3) + "...";
            holder.review.setText(text);
            mReadMoreButton = new Button(context);
            RelativeLayout ll = (RelativeLayout) convertView1.findViewById(R.id.layout);
            LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            lp.addRule(RelativeLayout.BELOW, holder.review.getId());
            ll.addView(mReadMoreButton, lp);
            mReadMoreButton.setText("Readmore");
            mReadMoreButton.setId(5);
            mReadMoreButton.setOnClickListener(onReadMoreClickListener);
        }


        return true;
    }

在这里,我使用以下代码解决了这个问题。它对我很有效

@凌驾 公共视图getView(int位置、视图转换视图、视图组父视图) {

if(convertView==null)
{
convertView=充气机。充气(R.layout.list_项,空);
holder=新的ViewHolder();
holder.review=(TextView)convertView.findViewById(R.id.text);
convertView.setTag(支架);
布局[位置]=转换视图;
}
holder=(ViewHolder)convertView.getTag();
item=评论。get(位置);
长度=位置;
Log.e(“内部getView”,即“+holder”);
Log.e(“item”,“item+item.getReview());
国际单项体育联合会(旗)
{   
holder.review.setText(item.getReview());
}
arr[职位]=持有人审核;
mViewTreeObserver=arr[position]。getViewTreeObserver();
mViewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener);
返回视图;
}
OnGlobalLayoutListener OnGlobalLayoutListener=新建OnGlobalLayoutListener()
{
@抑制警告(“弃用”)
@凌驾
公共图书馆
{
Log.e(“内部globallayout”和“);
ViewTreeObserver obs=holder.review.getViewTreeObserver();
obs.RemoveGlobalOnlayOutliner(本);
对于(;索引3)
{
System.out.println(“at index”+index+“是arr[index]”+arr[index]);
int lineEndIndex=arr[index].getLayout().getLineEnd(2);
字符串text=arr[index].getText().subSequence(0,lineEndIndex-3)+“…”;
holder=(ViewHolder)布局[index].getTag();
holder.review.setText(文本);
holder.mReadMoreButton=新按钮(上下文);
RelativeLayout ll=(RelativeLayout)布局[索引].findViewById(R.id.layout);
LayoutParams lp=新的LayoutParams(LayoutParams.MATCH_父级,LayoutParams.WRAP_内容);
lp.addRule(RelativeLayout.down,arr[index].getId());
System.out.println(“holder.review.getId()”+arr[index].getId());
ll.addView(holder.mReadMoreButton,lp);
系统输出打印项次(“ll”+ll+“lp”+lp);
holder.mReadMoreButton.setText(“Readmore”);
holder.mReadMoreButton.setId(j++);
holder.mReadMoreButton.setTag(索引);
holder.mReadMoreButton.setOnClickListener(onReadMoreClickListener);
}
}
}
}
};
OnClickListener onReadMoreClickListener=新建OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
v、 设置可见性(View.GONE);
clickedPosition=(整数)v.getTag();
item=reviews.get(单击位置);
//Log.d(“项目”,“项目+项目”);
Log.d(“布局[clickedPosition],”+布局[clickedPosition]);
holder=(ViewHolder)布局[clickedPosition].getTag();
holder.review.setText(item.getReview());
holder.mReadLessButton=新按钮(上下文);
RelativeLayout ll=(RelativeLayout)布局[clickedPosition]。findViewById(R.id.layout);
LayoutParams lp=新的LayoutParams(LayoutParams.MATCH_父级,LayoutParams.WRAP_内容);
lp.addRule(RelativeLayout.down,v.getId());
ll.addView(holder.mReadLessButton,lp);
holder.mReadLessButton.setText(“无读”);
holder.mReadLessButton.setId(k++);
holder.mReadLessButton.setTag(单击位置);
holder.mReadMoreButton.setVisibility(View.GONE);
holder.mReadLessButton.setOnClickListener(onReadLessClickListener);
}
};
OnClickListener onReadLessClickListener=新的OnClickListener()
{
@凌驾
公共void onClick(最终视图v)
{
v、 设置可见性(View.GONE);
clickedPosition=(整数)v.getTag();
布局l=arr[clickedPosition].getLayout();
如果(l!=null)
{
int lines=l.getLineCount();
Log.d(“行”,“行+行”);
如果(行数>3)
{
holder=(ViewHolder)布局[clickedPosition].getTag();
int lineEndIndex=arr[clickedPosition].getLayout().getLineEnd(2);
字符串text=arr[clickedPosition].getText().subSequence(0,lineEndIndex-3)+“…”;
flag=false;
holder.review.setText(文本);
holder.mReadMoreButton=新按钮(上下文);
RelativeLayout ll=(RelativeLayout)布局[clickedPosition]。findViewById(R.id.layout);
LayoutParams lp=新的LayoutParams(LayoutParams.MATCH_父级,LayoutParams.WRAP_内容);
lp.addRule(RelativeLayout.down,holder.review.getId());
ll.addView(holder.mReadMoreButton,lp);
holder.mReadMoreButton.setText(“Readmore”);
holder.mReadMoreButton.setId(a++);
holder.mReadMoreButton.setTag(单击位置);
holder.mReadLessButton.setVisibility(View.GONE);
holder.mReadMoreButton.setOnClickListener(onReadMoreClickListener);
}
}
}
};
    if (convertView == null)
    {
        convertView = inflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.review = (TextView) convertView.findViewById(R.id.text);
        convertView.setTag(holder);
        layouts[position] = convertView;

    }

    holder = (ViewHolder) convertView.getTag();
    item = reviews.get(position);
    length = position;
    Log.e("inside getView",""+holder);
    Log.e("item",""+item.getReview());
    if(flag)
    {   
    holder.review.setText(item.getReview());
    }
    arr[position] = holder.review;
    mViewTreeObserver = arr[position].getViewTreeObserver();
    mViewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener);
    return convertView;
}

OnGlobalLayoutListener onGlobalLayoutListener = new OnGlobalLayoutListener()
{

    @SuppressWarnings("deprecation")
    @Override
    public void onGlobalLayout()
    {
        Log.e("inside globallayout","");
        ViewTreeObserver obs = holder.review.getViewTreeObserver();
        obs.removeGlobalOnLayoutListener(this);
        for (; index <= length; index++)
        {
            Layout l = arr[index].getLayout();
            if (l != null)
            {
                int lines = l.getLineCount();
                Log.d("lines", "" + lines);
                if (lines > 3)
                {

                    System.out.println("at index" + index + "is arr[index]" + arr[index]);
                    int lineEndIndex = arr[index].getLayout().getLineEnd(2);
                    String text = arr[index].getText().subSequence(0, lineEndIndex - 3) + "...";
                    holder = (ViewHolder) layouts[index].getTag();
                    holder.review.setText(text);
                    holder.mReadMoreButton = new Button(context);
                    RelativeLayout ll = (RelativeLayout) layouts[index].findViewById(R.id.layout);
                    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                    lp.addRule(RelativeLayout.BELOW, arr[index].getId());
                    System.out.println("holder.review.getId()" + arr[index].getId());
                    ll.addView(holder.mReadMoreButton, lp);
                    System.out.println("ll " + ll + "lp " + lp);
                    holder.mReadMoreButton.setText("Readmore");
                    holder.mReadMoreButton.setId(j++);
                    holder.mReadMoreButton.setTag(index);
                    holder.mReadMoreButton.setOnClickListener(onReadMoreClickListener);

                }
            }

        }
    }
};

OnClickListener onReadMoreClickListener = new OnClickListener()
{

    @Override
    public void onClick(View v)
    {


        v.setVisibility(View.GONE);
        clickedPosition = (Integer) v.getTag();
        item = reviews.get(clickedPosition);
        //Log.d("item",""+item);
        Log.d("layout[clickedPosition]",""+layouts[clickedPosition]);
        holder = (ViewHolder) layouts[clickedPosition].getTag();
        holder.review.setText(item.getReview());
        holder.mReadLessButton = new Button(context);
        RelativeLayout ll = (RelativeLayout) layouts[clickedPosition].findViewById(R.id.layout);
        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.BELOW, v.getId());
        ll.addView(holder.mReadLessButton, lp);
        holder.mReadLessButton.setText("Readless");
        holder.mReadLessButton.setId(k++);
        holder.mReadLessButton.setTag(clickedPosition);
        holder.mReadMoreButton.setVisibility(View.GONE);
        holder.mReadLessButton.setOnClickListener(onReadLessClickListener);



    }
};

OnClickListener onReadLessClickListener = new OnClickListener()
{



    @Override
    public void onClick(final View v)
    {

        v.setVisibility(View.GONE);
        clickedPosition = (Integer) v.getTag();
        Layout l = arr[clickedPosition].getLayout();
        if (l != null)
        {
            int lines = l.getLineCount();
            Log.d("lines", "" + lines);
            if (lines > 3)
            {
                holder = (ViewHolder) layouts[clickedPosition].getTag();
                int lineEndIndex = arr[clickedPosition].getLayout().getLineEnd(2);
                String text = arr[clickedPosition].getText().subSequence(0, lineEndIndex - 3) + "...";
                flag=false;
                holder.review.setText(text);
                holder.mReadMoreButton = new Button(context);
                RelativeLayout ll = (RelativeLayout) layouts[clickedPosition].findViewById(R.id.layout);
                LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
                lp.addRule(RelativeLayout.BELOW, holder.review.getId());
                ll.addView(holder.mReadMoreButton, lp);
                holder.mReadMoreButton.setText("Readmore");
                holder.mReadMoreButton.setId(a++);
                holder.mReadMoreButton.setTag(clickedPosition);
                holder.mReadLessButton.setVisibility(View.GONE);
                holder.mReadMoreButton.setOnClickListener(onReadMoreClickListener);

            }
        }

    }
};