【问题标题】:Android ListView items disappear when scrollingAndroid ListView 项目在滚动时消失
【发布时间】:2016-01-17 10:18:21
【问题描述】:

我已经使用适配器将一些图片加载到 ListView 中。当用户单击列表的任何一行时,我会在末尾显示一个复选标记:

public class LazyImageLoadAdapter extends BaseAdapter implements OnClickListener{

    private Activity activity;
    List<String> names,facebookbid;
    String sent;

    private  LayoutInflater inflater=null;
    public ImageLoader imageLoader; 

    public LazyImageLoadAdapter(Activity a, List<String> n,List<String> fid,String s) {
        activity = a;
        names=n;
        facebookbid=fid;
        sent=s;


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


        imageLoader = new ImageLoader(activity.getApplicationContext(),"p");
    }

    @Override
    public int getViewTypeCount() {

        if (getCount() != 0)
            return getCount();

        return 1;
    }


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

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

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

    /********* Create a holder Class to contain inflated xml file elements *********/
    public  class ViewHolder{

        public TextView text;
        public ImageView image;
        public ImageView checkmark;
        public RelativeLayout friendsrow;


    }

    public View getView(final int position, View convertView, ViewGroup parent) {

            convertView=null;


        final ViewHolder holder;

        if(convertView==null){

            /****** Inflate tabitem.xml file for each row ( Defined below ) *******/
            convertView = inflater.inflate(R.layout.planners_friends_listrow, null);

            /****** View Holder Object to contain tabitem.xml file elements ******/

            holder = new ViewHolder();
            holder.text = (TextView) convertView.findViewById(R.id.planner_friend_name);
          (ImageView)convertView.findViewById(R.id.planner_friend_image);
            holder.checkmark=(ImageView)convertView.findViewById(R.id.checkmark);
            holder.friendsrow=(RelativeLayout)convertView.findViewById(R.id.friendsrow);

           /************  Set holder with LayoutInflater ************/
            convertView.setTag( holder );
        }
        else 
            holder=(ViewHolder)convertView.getTag();


        holder.text.setText(names.get(position));




        Typeface   face = Typeface.createFromAsset(convertView.getContext().getAssets(),
                "fonts/MAXWELL REGULAR.ttf");
        holder.text.setTypeface(face);

        ImageView image = holder.image;
      String link;


      if(sent.equals("planners"))
      {link=facebookbid.get(position);

      }
      else
      {
          link="https://graph.facebook.com/"+facebookbid.get(position)+"/picture?type=large";
      }


        //DisplayImage function from ImageLoader Class
        imageLoader.DisplayImage(link, image);


        holder.friendsrow.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                boolean a=isNetworkConnected();
                if(a==true)
                {

                    if(sender.equals("settings"))
                    {

                    }
                    else if(sender.equals("savethedate"))
                    {



                        if(sid.contains(facebookbid.get(position)))
                        {
                            if(sid.contains("_"))
                            {
                                sid=sid.replace("_"+facebookbid.get(position), "");
                            }
                            else
                            {
                                sid=sid.replace(facebookbid.get(position), "");
                            }

                            nb_selections--;
                            selectedids.remove(selectedids.size()-1);
                            sidetitle.setText("Invite ("+String.valueOf(nb_selections)+") friends");
                            holder.checkmark.setVisibility(View.GONE);
                        }
                        else
                        {
                            if(sid.isEmpty())
                            {
                                sid=sid+facebookbid.get(position);  
                            }
                            else
                            {
                                sid=sid+"_"+facebookbid.get(position);  
                            }

                            nb_selections++;
                            selectedids.add(facebookbid.get(position));
                            sidetitle.setText("Invite ("+String.valueOf(nb_selections)+") friends");
                            holder.checkmark.setVisibility(View.VISIBLE);
                        }

                    }
                    else
                    {
                        String friendname=names.get(position);
                        String friendid=facebookbid.get(position);
                        String friendgender=gender.get(position);
                         Intent    resultIntent = new Intent(Friends.this,Newmarriage.class);
                         resultIntent.putExtra("facebookbid", friendid);
                         resultIntent.putExtra("name", friendname);
                         resultIntent.putExtra("gender", friendgender);

                    if(sender.equals("planner"))
                    {
                        resultIntent.putExtra("plannerid",friendid);
                         resultIntent.putExtra("imageurl","https://graph.facebook.com/"+friendid+"/picture?type=large");

                         setResult(Activity.RESULT_OK, resultIntent);
                         finish();  
                    }
                    else
                    {

                        resultIntent.putExtra("plannerid","");
                        resultIntent.putExtra("imageurl","");
                     setResult(Activity.RESULT_OK, resultIntent);
                     finish();  

                    }

                    }   
                }
                else
                {
                    Toast.makeText(getApplicationContext(),"No internet connection",Toast.LENGTH_LONG).show();  
                }


            }
        });



        /******** Set Item Click Listner for LayoutInflater for each row ***********/
     //   vi.setOnClickListener(new OnItemClickListener(position));
        return convertView;
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

    }
} 

问题是:当 ListView 滚动时,复选标记图标就消失了。我做错了什么?

【问题讨论】:

  • 我觉得很奇怪,所有项目都使用相同类型的视图渲染,getViewTypeCount() 方法返回getCount()。我希望getViewTypeCount() 返回 1。
  • 但是 getViewTypeCount() 返回 1 而不是 getCount() !
  • 据我所知,从您的代码(条件if (getCount() != 0))中可以看出,它会返回 1,以防您在 facebookbid 列表中没有元素。否则返回getCount()

标签: java android listview


【解决方案1】:

查看您的代码,当用户单击其中一个项目时,您设置复选标记的可见性,然后显示/隐藏该项目。现在,当用户滚动时,项目被回收,您没有任何代码来检查项目是否已被检查。

所以简而言之,你需要一些基本的东西

if (checked) {
  //set visibility of the checkmark to visible 
} else {
  //set visibility of the checkmark to gone 
} 

【讨论】:

    【解决方案2】:

    首先,您需要将getView 方法更改为不要将convertView 重新初始化为nullgetView 中删除以下行

        public class LazyImageLoadAdapter extends BaseAdapter implements OnClickListener {
    
            private Activity activity;
            List<String> names, facebookbid;
            String sent;
    
            public ImageLoader imageLoader;
            private int size = 0;
            private HashMap<String, Boolean> mapClickStatus;
    
            public LazyImageLoadAdapter(Activity a, List<String> n, List<String> fid, String s) {
                activity = a;
                names = n;
                facebookbid = fid;
                sent = s;
                mapClickStatus = new HashMap<String, Boolean>();
    
    
                if (facebookbid != null)
                    size = facebookbid.size();
    // Give total size of the list item to getCount method
                imageLoader = new ImageLoader(activity, "p");
            }
    
            @Override
            public int getCount() {
    
                return size;
            }
    
            @Override
            public Object getItem(int position) {
                return position;
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
            /*********
             * Create a holder Class to contain inflated xml file elements
             *********/
            public class ViewHolder {
    
                public TextView text;
                public ImageView image;
                public ImageView checkmark;
                public RelativeLayout friendsrow;
    
    
            }
    
            public View getView(final int position, View convertView, ViewGroup parent) {
    
                // convertView=null;
    
                //It should not be null every time
    
                final ViewHolder holder;
    
                if (convertView == null) {
    
                    /****** Inflate tabitem.xml file for each row ( Defined below ) *******/
                    convertView = LayoutInflater.from(activity).inflate(R.layout.planners_friends_listrow, parent, false);
    
                    /****** View Holder Object to contain tabitem.xml file elements ******/
    
                    holder = new ViewHolder();
                    holder.text = (TextView) convertView.findViewById(R.id.planner_friend_name);
                    (ImageView) convertView.findViewById(R.id.planner_friend_image);
                    holder.checkmark = (ImageView) convertView.findViewById(R.id.checkmark);
                    holder.friendsrow = (RelativeLayout) convertView.findViewById(R.id.friendsrow);
    
                    /************  Set holder with LayoutInflater ************/
                    convertView.setTag(holder);
                } else
                    holder = (ViewHolder) convertView.getTag();
    
    
                holder.text.setText(names.get(position));
    
    
                Typeface face = Typeface.createFromAsset(convertView.getContext().getAssets(),
                        "fonts/MAXWELL REGULAR.ttf");
                holder.text.setTypeface(face);
    
                ImageView image = holder.image;
                String link;
    
    
                if (sent.equals("planners")) {
                    link = facebookbid.get(position);
    
                } else {
                    link = "https://graph.facebook.com/" + facebookbid.get(position) + "/picture?type=large";
                }
    
    
                //DisplayImage function from ImageLoader Class
                imageLoader.DisplayImage(link, image);
    
                // set the visibility of CheckMark ImageView based on the click status.
                if (mapClickStatus.get(facebookbid.get(position)))
                    holder.checkmark.setVisibility(View.VISIBLE);
                else
                    holder.checkmark.setVisibility(View.GONE);
    
                holder.friendsrow.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        boolean a = isNetworkConnected();
                        /// I dont know about the unique ID field in this so i took facebookbid.get(position) as a key
                        // To set click status of row item in hashmap.
                        mapClickStatus.put(facebookbid.get(position),
                                mapClickStatus.containsKey(facebookbid.get(position)) ? false : true);
                        if (a == true) {
    
                            if (sender.equals("settings")) {
    
                            } else if (sender.equals("savethedate")) {
    
    
                                if (sid.contains(facebookbid.get(position))) {
                                    if (sid.contains("_")) {
                                        sid = sid.replace("_" + facebookbid.get(position), "");
                                    } else {
                                        sid = sid.replace(facebookbid.get(position), "");
                                    }
    
                                    nb_selections--;
                                    selectedids.remove(selectedids.size() - 1);
                                    sidetitle.setText("Invite (" + String.valueOf(nb_selections) + ") friends");
                                    // holder.checkmark.setVisibility(View.GONE);
                                } else {
                                    if (sid.isEmpty()) {
                                        sid = sid + facebookbid.get(position);
                                    } else {
                                        sid = sid + "_" + facebookbid.get(position);
                                    }
    
                                    nb_selections++;
                                    selectedids.add(facebookbid.get(position));
                                    sidetitle.setText("Invite (" + String.valueOf(nb_selections) + ") friends");
                                    //  holder.checkmark.setVisibility(View.VISIBLE);
                                }
                                // TO refresh view with updated checkmark status
                                notifyDataSetChanged();
                            } else {
                                String friendname = names.get(position);
                                String friendid = facebookbid.get(position);
                                String friendgender = gender.get(position);
                                Intent resultIntent = new Intent(Friends.this, Newmarriage.class);
                                resultIntent.putExtra("facebookbid", friendid);
                                resultIntent.putExtra("name", friendname);
                                resultIntent.putExtra("gender", friendgender);
    
                                if (sender.equals("planner")) {
                                    resultIntent.putExtra("plannerid", friendid);
                                    resultIntent.putExtra("imageurl", "https://graph.facebook.com/" + friendid + "/picture?type=large");
    
                                    setResult(Activity.RESULT_OK, resultIntent);
                                    finish();
                                } else {
    
                                    resultIntent.putExtra("plannerid", "");
                                    resultIntent.putExtra("imageurl", "");
                                    setResult(Activity.RESULT_OK, resultIntent);
                                    finish();
    
                                }
    
                            }
                        } else {
                            Toast.makeText(getApplicationContext(), "No internet connection", Toast.LENGTH_LONG).show();
                        }
    
    
                    }
                });
    
    
                /******** Set Item Click Listner for LayoutInflater for each row ***********/
                //   vi.setOnClickListener(new OnItemClickListener(position));
                return convertView;
            }
    
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
    
            }
        }
    

    建议

    • 像下面这样附加父级的膨胀布局

    convertView = LayoutInflater.from(activity).inflate(R.layout.planners_friends_listrow, parent, false);
    
    • 避免使用多个集合(Arraylist 或 像那样显示数据)使用模型类或 JSON 或 Arraylist 地图等

    【讨论】:

    • 现在唯一不同的是,它们不是消失,而是重新定位
    • stackoverflow.com/a/34349311/1140237。您可以参考此答案以获取与基本适配器相关的 .. 注释中的解释 alsi
    • 你给我的链接是关于初始化字体一次,这没有帮助,在我的代码中,点击行时复选标记图标出现/消失,滚动时所有复选标记都消失了!
    • @MonzerYaghi 答案更新了格式化代码和 cmets 也给出了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多