如何为各个行元素设置onclick监听器?

时间:2014-03-20 05:13:11

标签: android listview onitemclicklistener

我的活动只包含一个列表视图。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical" >

    <ListView android:id="@+id/list_data"
              android:layout_height="match_parent"
              android:layout_width="match_parent"
              android:layout_weight="1"/>


</LinearLayout>

此列表的每一行都由此xml文件设置样式。每行有2个文本视图和一个按钮。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">

    <Button
        android:id="@+id/playPauseB"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Play" />    

    <TextView
        android:id="@+id/rec_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="2dp"
        android:gravity="center_vertical"
        android:text="Example application"
        android:textSize="20sp"
        android:layout_toRightOf="@id/playPauseB" />

    <TextView
        android:id="@+id/rec_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"            
        android:layout_below="@+id/rec_name"
        android:text="Sample Data 2"
        android:textSize="15sp" />

</RelativeLayout>

此listview有一个cutom游标适配器。我的问题是如何为一行中的每个按钮设置onClick监听器。以及如何访问每行的按钮?我的活动有一个DBHelper对象和customCursor对象。我的适配器包含一个bindView和newView方法。如果需要更多细节,请发表评论。

5 个答案:

答案 0 :(得分:3)

在getview()中简单添加点击监听器,就像你在活动中一样。

holder.button.setTag(position);
holder.button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    pos = (Integer) v.getTag();

                    Log.d("#####", "tag pos=" + pos);


                }
            });

点击按钮,您需要set Tag & get Tag以避免排名问题。

答案 1 :(得分:0)

您可以为适配器的getView方法中的每一行设置onClickListener

像这样

private View getView(int position, View convertView, ViewGroup parent) {
        View row = // initialize your row

        Button b = (Button)row.findViewById(R.id.button);
        b.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                        //Do something
                }
        })

}

答案 2 :(得分:0)

假设您的游标适配器扩展BaseAdapter;

实现getView方法如下:

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

    Button playPauseBtn = (Button) view.findViewById(R.id.playPauseB);
    playPauseBtn.setOnClickListener(playPauseListener);
}

OnClickListener playPauseListener = new OnClickListener() {      
    @Override
    public void onClick(View view) {
        //Do some thing ...
    }
};

答案 3 :(得分:0)

在CustomAdapter类中更改getView方法,如下所示:

  @Override
        public View getView(final int arg0, View convertview, ViewGroup arg2) {
            // TODO Auto-generated method stub
            final ViewHolder holder;
            if(convertview==null)
            {
                holder = new ViewHolder();
                convertview = layoutinflater.inflate(R.layout.yourXmlName, null);
                holder.txt1=(TextView)convertview.findViewById(R.id.rec_desc);
                        holder.txt2=(TextView)convertview.findViewById(R.id.rec_name);              
                         holder.btn=(Button)convertview.findViewById(R.id.playPauseB);
                convertview.setTag(holder);
            }
            else{
                holder=(ViewHolder)convertview.getTag();
            }
            holder.txt1.setOnClickListener(new OnClickListener() {
             @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub


        });
holder.txt2.setOnClickListener(new OnClickListener() {
             @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub


        });

            holder.btn.setOnClickListener(new OnClickListener() {
             @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub


        });


            return convertview;
        }
        static class ViewHolder 
        {
            TextView txt1;
                TextView txt2;
            Button btn;
        }

答案 4 :(得分:0)

你可以试试这个

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View hView = convertView;
    final ViewHolder holder;

    if (convertView == null) {
        hView = mInflater.inflate(R.layout.listrow, null);
        holder = new ViewHolder();

        holder.text1 = (TextView) hView.findViewById(R.id.text1);
        holder.text2 = (TextView) hView.findViewById(R.id.text2);
        holder.button = (Button) hView.findViewById(R.id.button);

        hView.setTag(holder);
    }else{
        holder = (ViewHolder) hView.getTag();
    }

    holder.button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          // do your work on click...
        }
    });

   return  hView;

}

 static class ViewHolder {
            TextView text1;
             TextView text2;
            Button button;

}