简体   繁体   中英

How do I create an OnClickListener for a button within my list adapter that will allow me to set the visibility for an EditText view

I currently have a listview that contains a button and EditText view. How do I properly implement an OnClickListener in my list adapter so when each button is clicked, the associated EditText within the view is hidden via the setVisibility method.

Based on my current implementation of the OnClickListener in my list adapter, when I click a button to hide the corresponding EditText within the view it hides the very last EditText within the viewport and does not hide the corresponding EditText that it's in the same view as the button. Below is my listview xml file (inspection_single_row.xml), my list adapter (InspectionAdapter.java) and main activity (MainActivity).

inspection_single_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Was the sink cleaned floors mopped"
            android:id="@+id/text_id"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/check_boxes"
            android:layout_marginBottom="20dp"
            android:gravity="center_horizontal">


            <RadioGroup
                android:id="@+id/groupRadio"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="15dp"
                android:orientation="horizontal">

                <RadioButton
                    android:id="@+id/radioComplete"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Complete"
                    android:checked="false"
                    android:textColor="@color/grey_mid"/>

                <RadioButton
                    android:id="@+id/radioIncomplete"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Incomplete"
                    android:checked="false"
                    android:textColor="@color/grey_mid"
                    android:layout_marginLeft="25dp"/>

            </RadioGroup>

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="click"
                android:onClick="clickMe"
                android:id="@+id/btn"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:id="@+id/master_linlayout"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp">


            <EditText
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:layout_marginBottom="20dp"
                android:gravity="top"
                android:padding="10dp"
                android:textSize="14sp"
                android:background="@drawable/border2"
                android:inputType="textMultiLine"
                android:textColor="@color/grey_mid"
                android:id="@+id/edit_text"/>


        </LinearLayout>


    </LinearLayout>


</LinearLayout>

InspectionAdapter.java

public class InspectionAdapter extends ArrayAdapter<InspectionObject> {

    ArrayList<InspectionObject> arrayList;
    Context context;
    int Resource;
    LayoutInflater layoutInflater;
    ProgressHolder holder;

    public InspectionAdapter(Context context, int resource, ArrayList<InspectionObject> objects) {
        super(context, resource, objects);


        this.context = context;
        arrayList = objects;
        Resource = resource;

        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    private static class ProgressHolder {

        public RadioGroup radio_group;
        public EditText deficiency_notes;
        public TextView inspection_task;
        public RadioButton radio_yes;
        public RadioButton radio_no;
        public LinearLayout master_layout;
        public Button my_button;

    }

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

        View v = convertView;
        holder = new ProgressHolder();

        if(v == null)
            {
            v = layoutInflater.inflate(Resource, null);

            holder.radio_group = (RadioGroup)v.findViewById(R.id.groupRadio);
            holder.deficiency_notes = (EditText)v.findViewById(R.id.edit_text);
            holder.inspection_task = (TextView)v.findViewById(R.id.text_id);
            holder.radio_yes = (RadioButton)v.findViewById(R.id.radioComplete);
            holder.radio_no = (RadioButton)v.findViewById(R.id.radioIncomplete);
            holder.master_layout = (LinearLayout)v.findViewById(R.id.master_linlayout);
            holder.my_button = (Button)v.findViewById(R.id.btn);

            v.setTag(holder);

            }else{
            holder = (ProgressHolder)v.getTag();
        }

        final InspectionObject inspectionObject = arrayList.get(position);

        holder.my_button.setTag(position);
        holder.deficiency_notes.setTag(position);
        holder.my_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int pos = (Integer) v.getTag();  //the real and updated position
                Log.i("ConfirmAdapter","Button @ position : " + pos);

                Log.i("ConfirmAdapter","EditText @ position : " + holder.deficiency_notes.getTag());

            }
        });


        return v;
    }

}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ListView lv;
    InspectionAdapter inspection_adapter;
    ArrayList<InspectionObject> inspectionList;
    Boolean eval;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = findViewById(R.id.listView2);

        inspectionList = new ArrayList<InspectionObject>();

        inspectionList = new ArrayList<InspectionObject>();

        inspectionList.add(new InspectionObject(true, "", "Were the floor mopped?"));
        inspectionList.add(new InspectionObject(true, "", "Were the mirrors cleaned?"));
        inspectionList.add(new InspectionObject(false, "", "Were the toilets cleaned?"));
        inspectionList.add(new InspectionObject(true, "", "Was high/low dusting performed?"));

        inspection_adapter = new InspectionAdapter(getApplicationContext(), R.layout.inspection_single_row, inspectionList);
        lv.setAdapter(inspection_adapter);



    }


}

Edit: In this part

Log.i("ConfirmAdapter","EditText @ position : " + holder.deficiency_notes.getTag())

you are still referencing the holder variable that is created last. As i said before: In getView, for every view, you create a new ProgressHolder assigning it to holder variable. So holder is overwritten everytime getView is called. That's why, Log.i gives your last item.

Try the following:

Put the new ProgressHolder inside if clause.

if(v == null)
        {
            holder = new ProgressHolder();

This way it only creates a new instance, when the view is null.

Instead of setting the tag for the button to position you can set it to holder like this

holder.my_button.setTag(holder);

you don't need to set tag for EditText.

Then in the onClick you get the corresponding instance of ProgressHolder via getTag() and change the visibilty like this:

holder.my_button.setTag(holder);
holder.my_button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        ProgressHolder clickedHolder = (ProgressHolder)view.getTag();
        clickedHolder.deficiency_notes.setVisibility(View.GONE);

    }
});

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