You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:46:02