java - ImageView只显示在listview的最后一行

标签 java android listview imageview

我有一个 ListView 的 Activity ,其中包含几个 EditText 和 ImageView 。 当用户注册时,他的数据(姓名、电话、个人资料图片等...)存储在 firebase 中。 我希望位于 ListView 行中的 ImageView 显示每个用户的个人资料图像。 我有图像下载 Uri,我使用 picaso 将个人资料图像设置为 ImageView 。

问题是:个人资料图片只显示在 ListView 的最后一行..

这就是我将个人资料图片设置到 ImageView 的方式:

public void getProfileImage() {
    mDatabase.child("Users").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    User user = ds.getValue(User.class);
                    if (!user.getUserImage().equals("default"))
                        Picasso.with(getContext()).load(user.getUserImage()).into(profileImage);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

希望有人能弄清楚是什么问题。 谢谢。

编辑: 这是 ListView 适配器:

public class mainScreenAdapter extends ArrayAdapter<TrempData>  {

    private TextView  name ,timestamp ,uid, from,to,date,time,myextra ;
    private ImageButton phoneBtn;
    private ImageView timeline, profileImage;
    private int layoutResource;
    private FirebaseAuth firebaseAuth;
    private DatabaseReference mDatabase;



    public mainScreenAdapter(Context context, int layoutResource, ArrayList<TrempData> list) {
        super(context, layoutResource, list);
        this.layoutResource = layoutResource;
        firebaseAuth = FirebaseAuth.getInstance();
        mDatabase = FirebaseDatabase.getInstance().getReference();

    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;


        if (view == null) {
            final LayoutInflater Inflater = LayoutInflater.from(getContext());
            view = Inflater.inflate(layoutResource, null);

        }

        final TrempData data = getItem(position);
        //data.setPos(position);
        //int[] androidColors = getContext().getResources().getIntArray(R.array.androidcolors);
        //int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)];


        if (data != null) {
            name = (TextView) view.findViewById(R.id.myname);
            phoneBtn = (ImageButton) view.findViewById(R.id.myphone);
            //myphonestr = (TextView)view.findViewById(R.id.myphonestr);
            timestamp = (TextView) view.findViewById(R.id.mytimestamp);
            uid = (TextView) view.findViewById(R.id.myuid);
            timeline = (ImageView)view.findViewById(R.id.timeline);
            profileImage = (ImageView)view.findViewById(R.id.mycar);
            date = (TextView) view.findViewById(R.id.mydate);
            time = (TextView) view.findViewById(R.id.mytime);
            from = (TextView) view.findViewById(R.id.myfrom);
            to = (TextView) view.findViewById(R.id.myto);
            myextra = (TextView) view.findViewById(R.id.myextra);
            name.setText(data.get_name());
            //name.setTextColor(randomAndroidColor);
            //myphonestr.setText(data.get_phone());
            timestamp.setText(data.get_timestamp());
            uid.setText(data.get_uid());
            date.setText(data.get_date());
            time.setText(data.get_time());
            to.setText(data.get_to());
            from.setText(data.get_from());
            uid.setText(data.get_uid());
            myextra.setText(data.get_extras());

            phoneBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent i = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + data.get_phone()));
                    getContext().startActivity(i);
                }
            });

            if(firebaseAuth.getCurrentUser().getUid().equals(uid.getText())){

                phoneBtn.setVisibility(View.GONE);
                //car.setColorFilter(Color.rgb(255,164,30));

            }
            else{

                phoneBtn.setVisibility(View.VISIBLE);
                //car.setColorFilter(Color.rgb(176,176,176));

            }
        }
        getProfileImage();
        return view;

    }

    public void getProfileImage() {
        mDatabase.child("Users").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    User user = ds.getValue(User.class);
                    if (!user.getUserImage().equals("default"))
                        Picasso.with(getContext()).load(user.getUserImage()).into(profileImage);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

}

更新: 我做了@Danilo de Oliveira 建议我做的事情并且它有效但现在我遇到了新问题。尽管 firebase 中每个用户的下载图片 Uri 不同,但每一行的个人资料图片都相同

最佳答案

问题是您每次运行 getView() 时都会调用 getProfileImage()。这是实际发生的事情:

对于第 1 行: 遍历所有 dataSnapshot.getChildren() 加载图像到 profileImage

对于第 2 行: 遍历所有 dataSnapshot.getChildren() 加载图像到 profileImage

对于第 3 行: 遍历所有 dataSnapshot.getChildren() 加载图像到 profileImage

...

所以你总是加载 N 张照片到 profileImage,最后一张图片显示在每一行。

这应该是流程:

1. Load all your data from firebase.
2. Store them in an ArrayList<User> mUsers
3. listView.setAdapter(yourAdapter)
4. In getView()
    4a. Get your user by mUsers.get(position)
    4b. Get your imageview by view.findViewById(...)
    4c. Load your image here.

这应该有效。

此外,我认为您应该检查 ListView 和列表适配器的工作原理。

关于java - ImageView只显示在listview的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45889899/

相关文章:

android - 将 Canvas 内的游戏对象移动到接触点

.net - 网格或 ListView 行和列重新排序 WPF

java - Java 包装类的不可变性文档

java - 这可能吗? : HashMap<String, 字符>

android - "Private"仅供自应用程序使用的 Intent 过滤器

android - 使用自定义 BaseAdapter 从 ListView 中删除项目

java - 谁能帮我更正这段代码?

java - JAXB 注释 RootElement

java - 我可以在 Android 中通过按键时的后台应用程序以编程方式生成触摸事件吗?

android - 带有OpenCV3.0.0 Android的Camera Flash无法正常工作