【问题标题】:Updating Layout of a row in ListView when OnClick event is called调用 OnClick 事件时更新 ListView 中行的布局
【发布时间】:2014-05-25 12:59:02
【问题描述】:

我有一个 ListView,其中有一个 TextView 和一个自定义视图,我在其中绘制一个矩形。我想要一个功能,当单击一行 ListView 时,矩形应该变大,但其他行的矩形应该保持其先前的形状。

所以首先我增加布局的宽度和高度,然后尝试增加矩形大小,但是虽然我在单击侦听器时调用了 onDraw() 方法,但矩形的大小没有增加。

即使我只单击一次,我的 DrawView 的 onDraw() 方法也会被无限调用 谁能帮帮我。

DrawView.java,用于制作矩形

public class DrawView extends View {
    Paint paint = new Paint();
    public int x=-1;   // this variable will tell 

    public DrawView(Context context) {
        this(context, null);            
    }

    public DrawView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DrawView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onDraw(Canvas canvas) {
        paint.setStrokeWidth(10);
        paint.setColor(Color.MAGENTA);
        Log.e("Ronak","onDraw  "+x);

        canvas.drawRect(0, 0, 300, 200, paint );
        if(x>=0)  //this method is not called for first view but is called for onClickListener
        {
            increase(canvas);
        }


    }

    private void increase(Canvas canvas) {
        Log.e("Ronak","Increase");
        canvas.drawRect(0, 0, 700, 800, paint );

    }




}

我的自定义 ListView 的 getView() 函数

        public View getView(final int position,  View convertView, final ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
                        holder = new ViewHolder();
                        convertView = mInflater.inflate(R.layout.news_list_item,null);
                        final LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.mainLayout);
                           TextView t= (TextView)convertView.findViewById(R.id.textView1);
                        holder.textview = t;
                        holder.ll=layout;
                        final DrawView abc = (DrawView)convertView.findViewById(R.id.drawview);
                        holder.drawview=abc;
                        Log.e("Ronak","reached here3");            
                        convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.textview.setText(mData.get(position));


        convertView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
             Toast.makeText(c, "Clicked on="+position, 2).show();
             ViewHolder mH = (ViewHolder) v.getTag();
             LinearLayout.LayoutParams pp = new LinearLayout.LayoutParams(500,400);
             mH.ll.setLayoutParams(pp);
             DrawView dd=mH.drawview;
             dd.x=position;
             dd.invalidate();
                }
        });

        return convertView;



    }

     static class ViewHolder {
            public DrawView drawview;
            public TextView textview;
            public LinearLayout ll;
        } 

和我的ListView每一行的布局文件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="2dp" >


    <TextView
        android:id="@+id/textView1"
        android:layout_width="50dp"
        android:layout_height="30dp"
        android:text="Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <com.krish.horizontalscrollview.DrawView
        android:id="@+id/drawview"
        android:layout_width="150dp"
        android:layout_height="100dp" >
    </com.krish.horizontalscrollview.DrawView>

</LinearLayout> 

我的 ListView 类

    public class CenterLockHorizontalScrollview extends HorizontalScrollView {
    Context context;
    int prevIndex = 0;

    public CenterLockHorizontalScrollview(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        this.setSmoothScrollingEnabled(true);

    }



    public void setAdapter(Context context, CustomListAdapter mAdapter) {

        try {
            fillViewWithAdapter(mAdapter);
        } catch (ZeroChildException e) {

            e.printStackTrace();
        }
    }

    private void fillViewWithAdapter(CustomListAdapter mAdapter)
            throws ZeroChildException {
        if (getChildCount() == 0) {
            throw new ZeroChildException(
                    "CenterLockHorizontalScrollView must have one child");
        }
        if (getChildCount() == 0 || mAdapter == null)
            return;

        ViewGroup parent = (ViewGroup) getChildAt(0);

        //parent.removeAllViews();

        for (int i = 0; i < mAdapter.getCount(); i++) {
            parent.addView(mAdapter.getView(i, null, parent));
        }
    }

【问题讨论】:

    标签: android listview android-listview android-canvas onclicklistener


    【解决方案1】:

    我想你在 mData 中存储了一个字符串列表。使用成员 mData 和 mIsSelected(布尔值)创建一个类,并在适配器中传递此类的一个对象。在 onClick() 检查该行是否已经被选中,反转 mIsSelected 的值并在结束调用 notifyDataSetChanged() 时执行所需的操作

    【讨论】:

    • 谢谢您的回答,但我的问题是当我单击 ListView 中的行时矩形大小没有增加
    • 继续前面的评论,即使我点击它时它会进入 increase() 方法,但画布上没有显示更大的矩形
    • @user3265443 您是否在适配器上调用notifyDataSetChanged 并在ListView 本身上调用invalidate
    • @AleksG 非常抱歉,但我没有得到你。你能解释一下你想说的吗
    • @user3265443 处理列表项布局中的更改后,在适配器上调用方法 notifyDataSetChanged 并在实际 ListView 上调用 invalidate - 我认为这很明显
    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多