简体   繁体   中英

Android Listview with active buttons which change text in the row

Hi I need help with active buttons in listview row. Idea is then i pressed button in the row it change textview. This list row must be avtivated in setOnItemLongClickListener (); Can anyone show me example or tutorial how make something like this or some example or show there is my problem? I tired for google it and wont get answer... I new in android and sorry for my language and tnx for any help ;) my Idea.

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

Then button pressed textview become number like this:

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

I made then button change it but problem is it change more rows. Like

+-----------------------------------------+
| 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
+-----------------------------------------+

I'm using SimpleAdapter to get list.

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)); 
            }                   
        });
    }
};

My Layout XML is

  <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>    

you need to create custom adapter for your list view. And in getView() method of this adapter your should set on click listener for button. This listener will call when you've pressed row button. And in this listener you have to get row data which you will change. Mm.. I think you should get it from tag of view, which in parametor of onClick of your listener. And also you should set this tag. In following example I show how..

@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;
        }
    }

it's not your situation but the same..

Not really sure why you are setting an onclick listener inside your longclick listener.

What you should be doing is creating a custom adapter and inside your custom adapter override the getView method and inflate the xml file which contains the

textview textview textview button

then get references to the button and textview using

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

and bind an onClicklistener to this button reference which edits the text in this textView reference.

ListView re-use rows as an optimization, that's why you see several row with the changed text once you clicked on a button.

You need to set your textView value for all rows, even if the text is the same as the one in your layout.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM