1

嗨,我需要有关 listview 行中活动按钮的帮助。想法是然后我按下它更改文本视图的行中的按钮。此列表行必须在setOnItemLongClickListener () 中激活;谁能告诉我示例或教程如何制作这样的东西或一些示例或显示我的问题?我厌倦了谷歌它并且不会得到答案......我是android新手,很抱歉我的语言和tnx有任何帮助;)我的想法。

+-----------------------------------------+
| textview | textview | textview | Button |
+----------+----------+----------+--------+
| textview | textview | textview | Button |
+-----------------------------------------+

然后按钮按下 textview 变成这样的数字:

+-----------------------------------------+
| textview | textview | textview | Button |
+----------+----------+----------+--------+
| textview | textview |     1    | Button | <- this button was pressed
+-----------------------------------------+

我做了然后按钮改变它,但问题是它改变了更多的行。像

+-----------------------------------------+
| textview | textview | textview | Button |
+----------+----------+----------+--------+
| textview | textview |     1    | Button | <- this button was pressed
+-----------------------------------------+
| textview | textview | textview | Button |
+----------+----------+----------+--------+
| textview | textview |     1    | Button | <- this button was **not** pressed
+----------+----------+----------+--------+
| textview | textview | textview | Button |
+----------+----------+----------+--------+
| textview | textview |     1    | Button | <- this button was **not** pressed
+-----------------------------------------+

我正在使用 SimpleAdapter 来获取列表。

ListView lv = getListView();   
lv.setOnItemLongClickListener(listener);

OnItemLongClickListener listener = new OnItemLongClickListener() {
    public boolean onItemLongClick(AdapterView<?> parent, final View view, int position, long id) {
        btn1 = (Button) view.findViewById(R.id.button1);
        btn1.setOnClickListener(new OnClickListener(){
            int number= 0;
            public void onClick(View v) {
                // TODO Auto-generated method stub
                TextView textView = (TextView) v.findViewById(R.id.textView_must_be_changed);
                number++;
                textView.setText(String.valueOf(number)); 
            }                   
        });
    }
};

我的布局 XML 是

  <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:id="@+id/gridas"
      android:layout_height="fill_parent"
      android:choiceMode="multipleChoice"
      android:columnCount="10"
      android:descendantFocusability="beforeDescendants" >


      <TextView
          android:id="@+id/Textview"
          android:layout_column="5"
          android:layout_columnSpan="3"
          android:layout_gravity="left|bottom"
          android:layout_row="1"
          android:layout_rowSpan="2"
          android:text="4.3 kg" />

      <TextView
          android:id="@+id/Textview"
          android:layout_column="7"
          android:layout_gravity="left"
          android:layout_row="1"
          android:layout_rowSpan="2"
          android:text="35 cm" />



      <TextView
          android:id="@+id/Textview"
          android:layout_width="163dp"
          android:layout_height="49dp"
          android:layout_column="9"
          android:layout_gravity="left"
          android:layout_row="2"
          android:gravity="left"
          android:text="949.00 Lt"
          android:textSize="32sp"
          android:textStyle="bold" />



      <TextView
          android:id="@+id/**textView_must_be_changed**"
          android:layout_column="9"
          android:layout_gravity="left|top"
          android:layout_row="1"
          android:text="tekstukas"
           />

      <Button
          android:id="@+id/button1"
          android:layout_column="9"
          android:layout_gravity="left|top"
          android:layout_row="3"
          android:text="Button" 
          android:focusable="false"
          android:focusableInTouchMode="false"/>

  </GridLayout>    
4

3 回答 3

3

您需要为列表视图创建自定义适配器。在此适配器的 getView() 方法中,您应该设置按钮的单击侦听器。当您按下行按钮时,此侦听器将调用。在此侦听器中,您必须获取将要更改的行数据。嗯..我认为你应该从视图标签中获取它,它在你的听众的 onClick 参数中。你也应该设置这个标签。在以下示例中,我展示了如何..

@Override
    public View getView( int position, View convertView, ViewGroup parent ){
        PhoneContactListItem item = getItem( position );
        TextView contactName;
        TextView contactPhone;
        CheckBox isCheckedCheckBox;

        if( convertView == null ) {
            convertView = LayoutInflater.from( context).inflate( R.layout.project_contact_list_item_layout, null );
            contactName = (TextView) convertView.findViewById( R.id.projectContactRow_contactName );
            contactPhone = (TextView) convertView.findViewById( R.id.projectContactRow_contactPhone );
            isCheckedCheckBox = (CheckBox) convertView.findViewById( R.id.projectContactRow_checkBox );

            convertView.setTag( new ViewHolder( contactName, contactPhone, isCheckedCheckBox ) );

            //setting on click listener for isCheckedCheckBox
            isCheckedCheckBox.setOnClickListener( new OnClickListener() {
                public void onClick(View v) {
                    CheckBox cb = (CheckBox)v;
                    PhoneContactListItem i = (PhoneContactListItem)cb.getTag();
                    i.toggleChecked();
                    cb.setChecked( i.isChecked() );
                }               
            });
        } else {
            ViewHolder vh = (ViewHolder)convertView.getTag();
            contactName = vh.getContactName();
            contactPhone = vh.getContactPhone();
            isCheckedCheckBox = vh.getIsCheckedCheckBox();
        }

        //initializing views
        isCheckedCheckBox.setTag( item );
        contactName.setText( item.getPhoneContact().getContactName() );
        contactPhone.setText( item.getPhoneContact().getContactPhone() );

        //initializing checkbox
        if( item.isChecked() )
            isCheckedCheckBox.setChecked( true );
        else 
            isCheckedCheckBox.setChecked( false );

        //enabling or disabling check box
        if( item.isCheckDisabled() ) 
            isCheckedCheckBox.setClickable( false );
        else 
            isCheckedCheckBox.setClickable( true );

        //showing checkboxes
        if( showCheckBoxes ) 
            isCheckedCheckBox.setVisibility( View.VISIBLE );
        else 
            isCheckedCheckBox.setVisibility( View.GONE );

        return convertView;
    }

    private class ViewHolder {
        private TextView contactName;
        private TextView contactPhone;
        private CheckBox isCheckedCheckBox;

        public ViewHolder( TextView contactName, TextView contactPhone, CheckBox isCheckedCheckBox ) {
            this.contactName = contactName;
            this.contactPhone = contactPhone;
            this.isCheckedCheckBox = isCheckedCheckBox;
        }

        /*
         * getters
         */
        public TextView getContactName() {
            return contactName;
        }
        public TextView getContactPhone() {
            return contactPhone;
        }
        public CheckBox getIsCheckedCheckBox() {
            return isCheckedCheckBox;
        }
    }

这不是你的情况,但一样..

于 2013-02-20T10:44:26.017 回答
1

不太确定为什么要在 longclick 侦听器中设置 onclick 侦听器。

您应该做的是创建一个自定义适配器,并在您的自定义适配器内部覆盖 getView 方法并膨胀包含

文本视图文本视图文本视图按钮

然后使用获取对按钮和文本视图的引用

buttonView = inflatedView.findViewById(R.id.button);
textView = inflatedView.findViewById(R.id.textView)

并将 onClicklistener 绑定到此按钮引用,该按钮引用编辑此 textView 引用中的文本。

于 2013-02-20T10:03:20.323 回答
0

ListView重新使用行作为优化,这就是为什么您在单击按钮后会看到几行带有更改的文本的原因。

您需要为所有textView行设置值,即使文本与布局中的文本相同。

于 2013-02-20T09:57:51.063 回答