Java ImageView仅显示在listview的最后一行中

Java ImageView仅显示在listview的最后一行中,java,android,listview,imageview,Java,Android,Listview,Imageview,我有一个包含EditText和image视图的listview活动。 当用户注册存储在firebase中的数据(姓名、电话、个人资料图像等)时。 我希望位于listview行中的imageview显示每个用户的配置文件图像。 我有图像下载Uri,我使用picaso将配置文件图像设置为图像视图 问题是:配置文件图像仅显示在listview的最后一行。 以下是我将配置文件图像设置为ImageView的方式: public void getProfileImage() { mDatabase.

我有一个包含EditText和image视图的listview活动。 当用户注册存储在firebase中的数据(姓名、电话、个人资料图像等)时。 我希望位于listview行中的imageview显示每个用户的配置文件图像。 我有图像下载Uri,我使用picaso将配置文件图像设置为图像视图

问题是:配置文件图像仅显示在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) {

            }
        });
    }

}
公共类mainScreenAdapter扩展了ArrayAdapter{
私有文本视图名称、时间戳、uid、从、到、日期、时间、myextra;
私人图像按钮电话;
私有ImageView时间线,profileImage;
私人内部布局资源;
私有FirebaseAuth FirebaseAuth;
私有数据库参考数据库;
公共mainScreenAdapter(上下文上下文、内部布局资源、ArrayList列表){
超级(上下文、布局资源、列表);
this.layoutResource=layoutResource;
firebaseAuth=firebaseAuth.getInstance();
mDatabase=FirebaseDatabase.getInstance().getReference();
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null){
最终LayoutFlater充气器=LayoutFlater.from(getContext());
视图=充气机。充气(布局资源,空);
}
最终TrempData数据=获取项目(位置);
//数据设置位置(位置);
//int[]androidColors=getContext().getResources().getIntArray(R.array.androidColors);
//int randomAndroidColor=androidColors[new Random().nextInt(androidColors.length)];
如果(数据!=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.findviewbyd(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(randomandoridcolor);
//myphonestr.setText(data.get_phone());
timestamp.setText(data.get_timestamp());
setText(data.get_uid());
date.setText(data.get_date());
time.setText(data.get_time());
to.setText(data.get_to());
from.setText(data.get_from());
setText(data.get_uid());
myextra.setText(data.get_extras());
phoneBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Intent i=新的Intent(Intent.ACTION\u DIAL,Uri.parse(“tel:”+data.get\u phone());
getContext().startActivity(i);
}
});
如果(firebaseAuth.getCurrentUser().getUid().equals(uid.getText())){
phoneBtn.setVisibility(View.GONE);
//car.setColorFilter(Color.rgb(255164,30));
}
否则{
phoneBtn.setVisibility(View.VISIBLE);
//car.setColorFilter(Color.rgb(176176));
}
}
getProfileImage();
返回视图;
}
public void getProfileImage(){
mDatabase.child(“用户”).addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot ds:DataSnapshot.getChildren()){
User=ds.getValue(User.class);
如果(!user.getUserImage().equals(“默认”))
Picasso.with(getContext()).load(user.getUserImage()).into(profileImage);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
}
更新: 我做了@Danilo de Oliveira建议我做的事情,这很有效,但现在我有了新的问题。虽然firebase中每个用户的下载图像Uri不同,但每一行中的配置文件图像都是相同的。“profileImage”是一个类变量,您通过异步请求获得图像Uri,因此加载图像Uri时,您拥有对ImageView的最后一次引用。 你可以试试

// The key type Integer is an example
private HashMap<Integer, ImageView> imageMap = new HashMap<>();
private int trempDataListSize;

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ...
    TrempData data = getItem(position);
    ...
    ImageView profileImage = (ImageView) view.findViewById(R.id.mycar);
    ...
    // Store the userId as key and imageView as value
    imageMap.put(data.getUserId(), profileImage);
    ...
    // Execute getProfileImage() once
    if (position = trempDataListSize - 1) {
        getProfileImage();
    }
}

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);

                // Check if imageMap has the key (userId)
                if (!user.getUserImage().equals("default")
                      && imageMap.containsKey(user.getId()))

                    // Get the value (imageView) by userId
                    Picasso.with(getContext())
                        .load(user.getUserImage())
                        .into(imageMap.get(user.getId()));
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
//键类型Integer就是一个例子
私有HashMap imageMap=新HashMap();
私有int trempDataListSize;
公共mainScreenAdapter(上下文上下文、内部布局资源、ArrayList列表){
超级(上下文、布局资源、列表);
this.layoutResource=layoutResource;
firebaseAuth=firebaseAuth.getInstance();
mDatabase=FirebaseDatabase.getInstance().getReference();
trempDataListSize=list.size();
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
...
TrempData data=getItem(位置);
...
ImageView profileImage=(ImageView)view.findViewById(R.id.mycar);
...
//将userId存储为key,将imageView存储为value
put(data.getUserId(),profileImage);
...
//执行一次getProfileImage()
如果(位置=TrempCatalistSize-1){
getProfileImage();
}
}
public void getProfileImage(){
mDatabase.child(“用户”).addValueEventListener(新的ValueEvent
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.