Pagina 1 di 1

Android - Problema ImageView sopra il bordo del ListView

MessaggioInviato: mercoledì 2 gennaio 2019, 16:49
da Dr_Bass
Salve a tutti.
Per esercizio, sto scrivendo un app Android che prende in input, tramite degli EditText, nome, cognome e numero e crea, con questi parametri, un contatto che inserisce in un ListView.
L'app funziona ma c'è un piccolo problema: il layout degli item del ListView ha un immagine fissa che per qualche strano motivo va "sopra" il bordo inferiore del ListView.

Ecco una gif che mostra il problema:
Immagine

Questo è il file di layout dell'Activity principale activity_main.xml:
Codice: Seleziona tutto
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <GridLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:rowCount="3"
        android:columnCount="2">

        <TextView
            android:layout_marginTop="5dp"
            android:textSize="20sp"
            android:textStyle="bold"
            android:text="Nome:"/>

        <EditText
            android:id="@+id/inputName"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="5dp"
            android:layout_width="150dp"
            android:textSize="20sp"
            android:paddingLeft="5dp"
            android:maxLines="1"
            android:background="@drawable/rectangle_border"/>

        <TextView
            android:layout_marginTop="5dp"
            android:textSize="20sp"
            android:textStyle="bold"
            android:text="Cognome:"/>

        <EditText
            android:id="@+id/inputSurname"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="5dp"
            android:layout_width="150dp"
            android:textSize="20sp"
            android:paddingLeft="5dp"
            android:maxLines="1"
            android:background="@drawable/rectangle_border"/>

        <TextView
            android:layout_marginTop="5dp"
            android:textSize="20sp"
            android:textStyle="bold"
            android:text="Numero:"/>

        <EditText
            android:id="@+id/inputNumber"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="5dp"
            android:layout_width="150dp"
            android:textSize="20sp"
            android:paddingLeft="5dp"
            android:maxLines="1"
            android:inputType="number"
            android:background="@drawable/rectangle_border"/>

    </GridLayout>


    <Button
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="10dp"
        android:textSize="20sp"
        android:textStyle="bold"
        android:text="Inserisci"
        android:background="@drawable/rectangle_border_colored"
        android:onClick="insert"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:textSize="20sp"
        android:textStyle="bold"
        android:text="Lista:"/>
   
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        android:paddingTop="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:background="@drawable/rectangle_border">
    </ListView>

</LinearLayout>


Il file di layout degli item del ListView list.xml:
Codice: Seleziona tutto
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="25sp"/>

        <TextView
            android:id="@+id/number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp"/>

    </LinearLayout>


    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:background="@drawable/contact"/>
</RelativeLayout>


Il file MainActivity.java:
Codice: Seleziona tutto
package com.example.alessandro.esame16012018;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MainActivity extends Activity
{
    private TextView name, surname, number;
    private ListView lv;
    private List<Contact> contacts;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        name = findViewById(R.id.inputName);
        surname = findViewById(R.id.inputSurname);
        number = findViewById(R.id.inputNumber);
        lv = findViewById(R.id.listView);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("Cancellazione");
                builder.setMessage("Vuoi cancellare il contatto?");
                builder.setPositiveButton("Si", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        CustomAdapter ca = (CustomAdapter) lv.getAdapter();
                        contacts.remove(position);
                        ca.notifyDataSetChanged();
                    }
                });
                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
                builder.show();
            }
        });
        if (savedInstanceState!=null)
            contacts = (ArrayList<Contact>)savedInstanceState.getSerializable("contacts");
        else
            contacts = new ArrayList<Contact>();
        lv.setAdapter(new CustomAdapter(this,R.layout.list,contacts));
    }

    public void onSaveInstanceState(Bundle outState)
    {
        outState.putSerializable("contacts",(ArrayList<Contact>)contacts);
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
    }

    public void insert(View v)
    {
        String nameText = name.getText().toString();
        String surnameText = surname.getText().toString();
        String numberText = number.getText().toString();
        if (nameText.length()>0 && surnameText.length()>0 && numberText.length()>0) {
            Contact contact = new Contact(nameText + " " + surnameText, numberText);
            if (!contacts.contains(contact)) {
                contacts.add(contact);
                CustomAdapter ca = (CustomAdapter) lv.getAdapter();
                ca.notifyDataSetChanged();
            }
        }
    }
}


Il file CustomAdapter.java:
Codice: Seleziona tutto
package com.example.alessandro.esame16012018;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.List;

public class CustomAdapter extends ArrayAdapter<Contact>
{
    private LayoutInflater inflater;
    private int resource;

    public CustomAdapter(Context context,int resourceId,List<Contact> objects)
    {
        super(context,resourceId,objects);
        resource = resourceId;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position,View convertView,ViewGroup parent)
    {
        if (convertView==null)
            convertView = inflater.inflate(resource,null);

        Contact contact = getItem(position);

        TextView name = convertView.findViewById(R.id.name);
        TextView number = convertView.findViewById(R.id.number);

        name.setText(contact.getName());
        number.setText(contact.getNumber());

        return convertView;
    }
}


Ho provato a cercare una soluzione ma non ho trovato niente.
Mi potete aiutare?