Custom ArrayAdapter

Използване на персонализиран ArrayAdapter

За показването на поредица от елементи в списък, използвайки персонализирано представяне на елементите чрез клас, трябва да се използва и индовидуално решение за XML оформление за всеки елемент. За да направим това, трябва да създадем свой собствен персонализиран ArrayAdapter клас.

Задача:

Да се създаде приложение извеждащо списък 
от потребители с името и града в който живеят.

Kлас за данни

Всеки ред в ListView ще съдържа име на човек и град. А всеки град ще съдържа име на град и пощенски код, така че класът ще изглежда:

public class City {
    private String name;
    private int PostCode;

    public City(String name, int postCode) {
        this.name = name;
        PostCode = postCode;
    }

    public String getName() {
        return name;
    }

    public int getPostCode() {
        return PostCode;
    }
}
public class User {
    private String name;
    private City city;

    public User(String name, City city) {
        this.name = name;
        this.city = city;
    }

    public String getName() {
        return name;
    }

    public City getCity() {
        return city;
    }
}

Генератор на данни

public class UserSource {
    public static ArrayList<User> generateItemsList() {
        ArrayList<User> cites = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
            cites.add(new User("User " + i,  new City("City " + i, 9000 + i)));
        }
        return  cites;
    }
}

Създаване на шаблон за оформление на ListView (layout)

Създава се с десен бутон върху папката layout -> new -> XML -> layout XML file

файла ще се казва: user_item.xml, защото ще съдържа визуалното описние на един ред от ListView. Root Tag ще е: LinearLayout - този таг оказва, че всички визуални елементи в него ще се подреждат в линия

От палитрата с ресурси изберете три TexView и ги провлачете върху изгледа, който създадохте.

Реализация на Adapter

Aдаптера, тряба да опише процеса на преобразуване на Java обекта в изглед това става в метода getView.

public class UserAdapter extends ArrayAdapter<User> {
    public UserAdapter(@NonNull Context context, @NonNull ArrayList<User> objects) {
        super(context, 0, objects);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        // Извличане на текущия елемент от списъка
        User user = getItem(position);
        // проверя ва се дали съществува изглед с ресурси ако не го създава
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.user_item, parent, false);
        }

        // извлича елементите от изгледа
        TextView name = convertView.findViewById(R.id.username);
        TextView city = convertView.findViewById(R.id.city);
        TextView postCode = convertView.findViewById(R.id.postCode);

        // присвоява информацията от обекта User на елементите в изгледа
        name.setText(user.getName());
        city.setText(user.getCity().getName());
        postCode.setText(Integer.toString(user.getCity().getPostCode()));

        // Върнете завършения изглед за изобразяване на екрана
        return convertView;
    }
}

Този адаптер има конструктор и getView() метод, за описване на преобразуването на елемента с данни в изглед за показване.

  • getView() е методът, който връща действителния изглед, използван като ред в ListView на определена позиция.

  • getItem() вече присъства в ArrayAdapter класа и неговата задача е просто да върне елемент от данни, от съответната позиция в колекцията с данни, който е свързан с този ArrayAdapter.

Прикачване на адаптера към ListView

За да покажем масив от елементи в ListView трябва да се дефинира UserAdapter в MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Създаване на колекция с потребители
        ArrayList<User> arrayOfUsers = UserSource.generateItemsList();
        // Създаване на адаптер
        UserAdapter adapter = new UserAdapter(this, arrayOfUsers);
        // Поставяне на адаптер за ListView
        ListView listView = findViewById(R.id.listView);
        listView.setAdapter(adapter);
    }
}

Last updated