listview向下滚动后项目图片混合

时间:2017-05-22 07:45:05

标签: android listview listadapter

我有一项活动来显示用户联系人列表。如果我的应用程序中存在联系人我想显示一个关注按钮,否则我想显示一个whatsapp和电报图标来邀请他们。

当我打开活动时,每件事情都很好,因为我想要,但当我向下滚动并回来时按照按钮和什么应用程序图标混合不同的联系人!按下按钮的用户可能会看到whatsapp图标或其他人可能会看到按钮! 每当我向下滚动时,位置都会改变!

我应该说所有联系人姓名和手机号码都是固定正确的!只是图像混合了!

我知道问题来自我的getView函数,但不知道如何解决它:( 我该怎么办呢? tnx:)

以下是我的所有适配器代码:

public class LazyAdapterContactsList extends BaseAdapter {

private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;

public ImageLoader profileImageLoader;
HashMap<String, String> song;
public LazyAdapterContactsList(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;

    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    profileImageLoader=new ImageLoader(activity.getApplicationContext());
}

public int getCount() {
    return data.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    ViewHolder holder = null;
    if(vi==null) {
        vi = inflater.inflate(R.layout.contacts_list_row, null);
        holder = new ViewHolder();


        holder.listID = (TextView) vi.findViewById(R.id.MyContactslistIDPosition);
        holder.name = (TextView) vi.findViewById(R.id.MyContactslistName); 
        holder.mobile = (TextView) vi.findViewById(R.id.MyContactslistMobileNumber);
        holder.whatsAppIcon = (ImageView) vi.findViewById(R.id.MyContactsListWhatsApp);
        holder.telegramIcon = (ImageView) vi.findViewById(R.id.MyContactsListTelegram);
        holder.followBtn = (Button) vi.findViewById(R.id.MyContactsListFollowBtn);
        holder.linearLayout = (LinearLayout) vi.findViewById(R.id.MyContactsthumbnail);

        holder.profile_thumb_image = (ImageView) vi.findViewById(R.id.MyContactslist_image_profilephoto);




        vi.setTag(holder);
    }
    else {
        holder = (ViewHolder)vi.getTag();          
    }



    song = data.get(position);

    // Setting all values in listview
    holder.listID.setText(song.get(MyContacts.KEY_ID));
    holder.name.setText(song.get(MyContacts.KEY_NAME));
    holder.mobile.setText(song.get(MyContacts.KEY_MOBILE));


if (song.get(MyContacts.KEY_USER_EXISTS).equals("1")) 
{


       if (song.get(MyContacts.KEY_THUMB_PROFILE_URL).equals("no")) {

        } else {
            profileImageLoader.DisplayImage(song.get(MyContacts.KEY_THUMB_PROFILE_URL), holder.profile_thumb_image);
        }


        }else {

            holder.linearLayout.setVisibility(View.VISIBLE);
            holder.followBtn.setVisibility(View.GONE);
        }


    return vi;
}

public static class ViewHolder {
    public TextView textView ,listID ,name,mobile;
    public ImageView whatsAppIcon ,telegramIcon;
    public Button followBtn;
    public LinearLayout linearLayout;
    public ImageView profile_thumb_image;
}
}

4 个答案:

答案 0 :(得分:3)

对于条件(if)中的HIDEVISIBLE列表视图的任何操作,您必须设置相反的HIDE或{ {1}}处于相反的情况(否则)

尝试此解决方案只需按以下方式更改代码:

VISIBLE

答案 1 :(得分:0)

简单的回答是,使用浮动按钮。按钮的位置将保持不变,您不会感到恼火

答案 2 :(得分:0)

您可以从系统中查看重用/回收 - 因此您必须每次在getView中重新设置profile_thumb_image

如果没有,您可能会获得一个回收视图,其中图像是在之前的getView调用中设置的。

答案 3 :(得分:0)

首先不要将此变量设为全局

HashMap歌曲;

如果可能的话,把它变成你的getView()方法让它成为最终的。

正如@coyer告诉

您可以从系统中查看重新使用/回收 - 因此您必须每次在getView中重新设置profile_thumb_image

希望这有助于你...如果有任何问题你可以提出