如何解决从Firebase加载数据到Koloda的ShapeableImageView失败问题?
Koloda滑动卡片无法从Firebase加载图片和名称的问题
已知条件
使用Koloda滑动卡片库的BaseAdapter,当前数据接收逻辑无法正常工作。
目标
从Firebase的Userw节点加载用户名称到卡片的TextView、加载用户图片到ShapeableImageView。
问题
数据接收逻辑失效,无法从Firebase加载名称和图片到Koloda卡片上。
相关代码
Adapter代码
public class SwipeAdapter extends BaseAdapter { private Context context; private List<Integer> list; public SwipeAdapter(Context context, List<Integer> list) { this.context = context; this.list = list; } @Override public int getCount() { return 20; } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View convertView, ViewGroup parent) { View view; if (convertView == null) { view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_koloda, parent, false); } else { view = convertView; } return view; } }
Activity代码
private SwipeAdapter adapter; private List<Integer> list; private TextView nameusercard; private ShapeableImageView imageosnovnoe; Koloda koloda; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); koloda = findViewById(R.id.koloda); list = new ArrayList<>(); adapter = new SwipeAdapter(this, list); koloda.setAdapter(adapter); nameusercard = (TextView) findViewById(R.id.nameusercard); imageosnovnoe = (ShapeableImageView) findViewById(R.id.imageosnovnoe); } private void getUserWInfo() { DatabaseReference reference = FirebaseDatabase.getInstance().getReference() .child("Userw"); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists() && snapshot.getChildrenCount() > 0) { String name = snapshot.child("name").getValue().toString(); nameusercard.setText(name); if (snapshot.hasChild("image")) { String image = snapshot.child("image").getValue().toString(); Picasso.get().load(image).into(imageosnovnoe); } } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); }
item_koloda布局代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_gravity="center" android:gravity="center" android:layout_height="match_parent"> <androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="500dp" android:layout_margin="15dp" app:cardCornerRadius="15dp" app:cardElevation="5dp"> <LinearLayout android:id="@+id/linearmain" android:layout_width="match_parent" android:layout_height="400dp" android:orientation="vertical"> <com.google.android.material.imageview.ShapeableImageView android:id="@+id/imageosnovnoe" android:layout_width="match_parent" android:layout_height="400dp" android:backgroundTint="@color/white" android:scaleType="fitXY" app:srcCompat="@drawable/aaaaa" /> </LinearLayout> <LinearLayout android:id="@+id/linearhori" android:layout_width="match_parent" android:layout_height="100dp" android:orientation="horizontal" android:layout_gravity="bottom" android:weightSum="3"> <ImageView android:id="@+id/like" android:layout_width="90dp" android:layout_height="90dp" android:layout_gravity="center" android:layout_weight="1" android:src="@drawable/sas" /> <ImageView android:id="@+id/disslike" android:layout_width="90dp" android:layout_height="90dp" android:layout_gravity="center" android:layout_weight="1" android:src="@drawable/aan" /> </LinearLayout> </androidx.cardview.widget.CardView> </LinearLayout>
已尝试操作
在Adapter中注册数据接收方法,但同样无法生效。
解决方案
1. 修复核心调用问题
Activity中的getUserWInfo()方法从未被调用,在onCreate()末尾添加启动调用:
@Override protected void onCreate(Bundle savedInstanceState) { // 原有代码... imageosnovnoe = (ShapeableImageView) findViewById(R.id.imageosnovnoe); // 启动数据加载 getUserWInfo(); }
2. 定义用户数据模型
创建User类存储Firebase返回的用户信息(Firebase序列化需要空构造函数):
public class User { private String name; private String image; public User() {} public User(String name, String image) { this.name = name; this.image = image; } public String getName() { return name; } public String getImage() { return image; } }
3. 重构Adapter适配用户数据
修改SwipeAdapter,接收User列表并在getView()中绑定卡片控件:
public class SwipeAdapter extends BaseAdapter { private Context context; private List<User> userList; public SwipeAdapter(Context context, List<User> userList) { this.context = context; this.userList = userList; } @Override public int getCount() { return userList.size(); } @Override public Object getItem(int position) { return userList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_koloda, parent, false); holder = new ViewHolder(); holder.imageosnovnoe = convertView.findViewById(R.id.imageosnovnoe); holder.nameusercard = convertView.findViewById(R.id.nameusercard); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } User user = userList.get(position); if (user.getName() != null) { holder.nameusercard.setText(user.getName()); } if (user.getImage() != null && !user.getImage().isEmpty()) { Picasso.get().load(user.getImage()).into(holder.imageosnovnoe); } return convertView; } private static class ViewHolder { ShapeableImageView imageosnovnoe; TextView nameusercard; } }
4. 更新Activity数据逻辑
将数据源改为List<User>,在Firebase回调中更新数据并通知Adapter:
private SwipeAdapter adapter; private List<User> userList; Koloda koloda; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); koloda = findViewById(R.id.koloda); userList = new ArrayList<>(); adapter = new SwipeAdapter(this, userList); koloda.setAdapter(adapter); getUserWInfo(); } private void getUserWInfo() { DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Userw"); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { userList.clear(); if (snapshot.exists()) { for (DataSnapshot userSnapshot : snapshot.getChildren()) { User user = userSnapshot.getValue(User.class); if (user != null) { userList.add(user); } } adapter.notifyDataSetChanged(); } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e("FirebaseError", error.getMessage()); } }); }
5. 完善卡片布局
在item_koloda的CardView中添加名称显示的TextView:
<!-- 插入到linearmain布局与linearhori布局之间 --> <TextView android:id="@+id/nameusercard" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textColor="@color/black" android:padding="10dp" android:gravity="center"/>
内容的提问来源于stack exchange,提问作者wanila show
相关产品推荐
相关产品推荐

