ListView Changing Items During Scroll

后端 未结 5 409
野性不改
野性不改 2021-01-13 15:05

I am implementing a ListFragment using a custom ArrayAdapter to populate the list. Each row item has an ImageView and three TextViews. Data is being parsed via XML and the i

相关标签:
5条回答
  • 2021-01-13 15:33

    In my case revert back was forgotten in if else condition:

    /*public class ContactAdapter extends BaseAdapter {
        public List<Contact> _data;
        private ArrayList<Contact> arraylist;
        Context _c;
        ViewHolder holder;
    
    public ContactAdapter(List<Contact> contacts, Context context) {
        _data = contacts;
        _c = context;
        this.arraylist = new ArrayList<Contact>();
        this.arraylist.addAll(_data);
    }*/
    @Override
    public View getView(final int i,  View convertView, final ViewGroup viewGroup) {
        View view = convertView;
        final Contact data = (Contact) _data.get(i);
        ViewHolder holder ;
    
        if (view == null) {
            Context context = viewGroup.getContext();
            LayoutInflater inflater = LayoutInflater.from(context);
            view = inflater.inflate(R.layout.contact_list, null,false);
            holder = new ViewHolder();
            holder.title = (TextView) view.findViewById(R.id.name);
            holder.imageView = (ImageView) view.findViewById(R.id.pic);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
    
        holder.title.setText(data.getName());
        // Set image if is null string
        if(!data.getThumb().equals("null")){
            try {
                 Bitmap myBitmap = BitmapFactory.decodeFile(ImageStorage.getImage(data.getThumb()).getAbsolutePath());
                 holder.imageView.setImageBitmap(myBitmap);
                }catch (Exception e){e.printStackTrace();
                 holder.imageView.setImageResource(R.mipmap.contactimage);
              }
    
        }else // I had forgotten this else 
            holder.imageView.setImageResource(R.mipmap.contactimage); 
    
    
        // same action with background color
        if(data.getId()==data.getFromContact() ){
             view.setBackgroundColor(Color.RED);
         } else{
             view.setBackgroundColor(Color.WHITE); //**revert back it**
         }
            return view;
    }
    

    ViewHolder

      private  static class ViewHolder {
        ImageView imageView;
        TextView title;
    
    }
    
    0 讨论(0)
  • 2021-01-13 15:36

    First of all define in getView() method into convertView=null; and comment else condition in this method and add int type = getItemViewType(position);. Also remove static keyword from each View item like Textview, ImageView in ViewHolder class.

    NOTE: override getViewTypeCount() and getItemViewType() in your adapter.

    if(convertView == null){
     switch (type) {
                case 0:
                      //First view[Row layout]
                break;
                case 1:
                     //Second view[Row layout]
                break;
    
                //another Case here....
    
       convertView.setTag(holder);
    
      //remove else part when used convertView =null;
            /*else {
            holder = (MyViewHolder) row.getTag();
        }*/
    
    } 
    
    @Override
        public int getItemViewType(int position) {
            // TODO Auto-generated method stub
            map = list.get(position); 
            message_type = map.get("message_type");
            if (message_type.equalsIgnoreCase("TEXT")) {
                return 0;
            } else {
                return 1;
            }
    
        }
    
        @Override
        public int getViewTypeCount() {
            // TODO Auto-generated method stub
            if (getCount() != 0)
                return getCount();
            return 2;
        }
    

    Do it now! Done!

    0 讨论(0)
  • 2021-01-13 15:36

    Just add these lines of code in your adapter class.

    @Override
    public int getViewTypeCount() {
    
        if (getCount() != 0)
            return getCount();
    
        return 1;
    }
    

    Hope it will solve your problem.

    0 讨论(0)
  • 2021-01-13 15:40

    I found the solution thanks to @frozenkoi. Ended up being the static variables inside the ViewHolder causing problems. They are now simply public and the class is static and the issue has been solved.

    private static class MyViewHolder {
        public TextView adTitle;
        public TextView region;
        public TextView time;
        public ImageView thumbnail;
    }
    
    0 讨论(0)
  • 2021-01-13 15:45

    Problem comes only when viewholder variables are defined static. Otherwise listview works good with or without viewholder in scroll.

    0 讨论(0)
提交回复
热议问题