Итак, я работаю с моим 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](https://i.stack.imgur.com/Q6M88.png)
Если я этого не сделаю, это будет выглядеть так:
![enter image description here](https://i.stack.imgur.com/9nWXx.png)
Это работает как в эмуляторе, так и на моем реальном телефоне .