Как установить CardViews из ArrayList в ListView - PullRequest
2 голосов
/ 26 мая 2019

Итак, я работаю с моим Android-приложением, которое берет данные из firebase, в основном список автомобилей, которые я сохраняю в ArrayList определенного класса. Я хочу показать список CardView с одним автомобильным объектом каждый, другими словами, что каждая карта отображает информацию об этом автомобиле (модель, км, цена и т. Д.). Я знаю, что для этого мне нужно использовать ListView в моем макете, но я не могу заставить адаптер работать.

Идея в том, что он показывает что-то вроде этого, но с фотографиями автомобилей и прочим: введите описание изображения здесь

Я не очень знаком с этим типом структуры, так как недавно начал над ней работать, но, думаю, я понимаю, как она работает. Я сделал макет карты для отображения каждого автомобиля и попытался создать класс ViewHolder. Спасибо за совет! Мой код:

Vehicle класс:

    public class Vehicle {

    int anio, cv, kms, puertas;
    double precio;
    String combustible, foto, marca, modelo, palanca;

    public Vehicle() {

    } //setters and getters are too, but I omitted them

Мой cardview_template.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:padding="16dp"
    >

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/cv"
        >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="16dp"
            >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/car_photo"
                android:src="@drawable/ic_home_icon"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:layout_marginRight="16dp"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/marca"
                android:text="Mercedes-Benz"
                android:layout_toRightOf="@+id/car_photo"
                android:layout_alignParentTop="true"
                android:textSize="30sp"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/kms"
                android:text="128000"
                android:layout_toRightOf="@+id/car_photo"
                android:layout_below="@+id/marca"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/precio"
                android:text="2018"
                android:layout_toRightOf="@+id/car_photo"
                android:layout_below="@+id/kms"
                />

        </RelativeLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>

Часть кода, которая находится в методе onCreate() в mi MainActivity: Я редактировал код. СМОТРЕТЬ В РЕДАКТИРОВАНИИ НИЖЕ

И, наконец, класс, который я использовал для adapter. Я думаю, что проблема здесь: Я отредактировал класс. СМОТРЕТЬ В РЕДАКТИРОВКЕ НИЖЕ


EDIT Следуя советам, я изменил ListView с помощью RecyclerView, но он тоже не сработал. Я не получаю никаких ошибок: CardViews просто не отображаются в моем RecyclerView.

Вот мой новый класс адаптера и новый код в MainActivity onCreate()

адаптер:

public class VehicleListAdapter extends RecyclerView.Adapter<VehicleListAdapter.VehicleViewHolder> {

private ArrayList<Vehicle> mVehicleList;

public static class VehicleViewHolder extends  RecyclerView.ViewHolder {

    public ImageView mImageView;
    public TextView mTextView1;
    public TextView mTextView2;
    public TextView mTextView3;


    public VehicleViewHolder(View itemView) {
        super(itemView);
        mImageView = itemView.findViewById(R.id.car_photo);
        mTextView1 = itemView.findViewById(R.id.marca);
        mTextView2 = itemView.findViewById(R.id.modelo);
        mTextView3 = itemView.findViewById(R.id.precio);
    }
}

public VehicleListAdapter(ArrayList<Vehicle> vehicleslist) {
    mVehicleList = vehicleslist;
}

@NonNull
@Override
public VehicleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    //Links the cardview layout and prepares the ViewHolder
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_template, parent, false);
    VehicleViewHolder vvh = new VehicleViewHolder(v);
    return vvh;
}

@Override
public void onBindViewHolder(@NonNull VehicleViewHolder holder, int position) {
    /*
    *   Links the layout elements with the variables in this class
    *   and put the object values in them
    */
    Vehicle currentVehicle = mVehicleList.get(position);

    //Uses Picasso librarie to set the image in the holder's ImageView
    Picasso.get().load(currentVehicle.foto).into(holder.mImageView);

    holder.mTextView1.setText(currentVehicle.getMarca());
    holder.mTextView2.setText(currentVehicle.getModelo());
    holder.mTextView3.setText(String.valueOf(currentVehicle.getPrecio()));
}

@Override
public int getItemCount() {
    return mVehicleList.size();
}

MainActivity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
(...)
    //Prepares the recycler view and shows the data
    mRecyclerView = findViewById(R.id.recyclerView);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(this);
    mAdapter = new VehicleListAdapter(vehiclesList);

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setAdapter(mAdapter);
}

EDIT2

Хорошо, я наткнулся на очень странную вещь . Если я поставлю точку отладки где-нибудь в onCreate() и затем выполню отладку приложения, она будет работать нормально. Я полностью потерян.

enter image description here enter image description here

Если я этого не сделаю, это будет выглядеть так:

enter image description here

Это работает как в эмуляторе, так и на моем реальном телефоне .

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Я знаю, что для этого мне нужно использовать ListView в моем макете, но я не могу заставить адаптер работать.

На самом деле вам нужно знать, что приложениям Android предоставляется определенный объем ОЗУ для работы, которого будет меньше, если вы подумаете об обработке изображений. Следовательно, использование ListView не рекомендуется для обработки изображений, особенно для огромного количества изображений. Решением этой проблемы является использование RecyclerView вместо ListView .

Также, если вам нужно использовать RecyclerView, вам нужно расширить RecyclerViewAdapter для класса адаптера, который будет иметь свой собственный подкласс ViewHolder.

RecyclerView прост в использовании, но изначально сложен. После практики вы овладеете им.

Вы можете перейти по этой ссылке на YouTube RecyclerView + CardView - Часть 1 - ПЛАНЫ И ПОЛЬЗОВАТЕЛЬСКИЕ ОБЪЕКТЫ - Руководство по Android Studio

Если у вас все еще есть вопросы, пожалуйста, прокомментируйте, я был бы рад ответить.

0 голосов
/ 26 мая 2019

Прежде всего вы должны использовать recyclerView вместо ListView.

вот что вы пропустили:

в методе onCreate замените это:

VehicleListAdapter adapter = new VehicleListAdapter(this, R.layout.content_main, vehiclesList);

на

VehicleListAdapter adapter = new VehicleListAdapter(this, R.layout.cardview_template, vehiclesList);
...