2015-04-16 4 views
0

Мне нужно поймать прокрутки событий внутри моего настраиваемого адаптера ListView, поэтому я реализовал OnScrollListener в нем, но его методы не вызываются. Я искал повсюду ответ, но без везения, никаких ошибок не было исключений.OnScrollListener не работает внутри настраиваемого адаптера ListView

Что может быть неправильным?

ListView адаптер:

import java.util.ArrayList; 


import android.app.Activity; 
import android.content.Context; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnFocusChangeListener; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.AbsListView; 
import android.widget.AbsListView.OnScrollListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.Spinner; 


    public class PhotosListViewAdapter extends ArrayAdapter<ImageItemsSetter> implements OnScrollListener { 

     DeleteImageListener dListener; 
     private Context context; 
     private int layoutResourceId; 
     private ArrayList<ImageItemsSetter> data = new ArrayList<ImageItemsSetter>(); 

     //standard constructor 
     public PhotosListViewAdapter(Context context, int layoutResourceId, ArrayList<ImageItemsSetter> data) { 
      super(context, layoutResourceId, data); 
      this.layoutResourceId = layoutResourceId; 
      this.context = context; 
      this.data = data;    
     }   

     static class ViewHolder { 

      public ImageView Img; 
      public EditText quantity; 
      public Spinner spinner; 
      public Button delete; 

     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      View row = convertView; 
      ViewHolder holder = null;    

      ImageItemsSetter image = data.get(position); 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 
      holder = new ViewHolder(); 

      holder.Img = (ImageView) row.findViewById(R.id.Img); 

      holder.quantity = (EditText) row.findViewById(R.id.quantity); 
      // holder.quantity.addTextChangedListener(new GenericTextWatcher(holder.quantity));   

      holder.spinner = (Spinner) row.findViewById(R.id.photo_format); 
      holder.delete = (Button) row.findViewById(R.id.deleteImage); 

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

     holder.Img.setImageBitmap(image.getTheImage());    
     holder.quantity.setText(image.getQuantity()); 


     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, 
       R.array.formats_array, android.R.layout.simple_spinner_item);  
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  
     holder.spinner.setAdapter(adapter); 

     //The delete button 
     holder.delete.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) {   

       if (dListener != null) { 
        dListener.onDeletePressed(position); 
       }  
      }   
      });  

     /* 
     holder.spinner.setOnItemSelectedListener(new OnItemSelectedListener() {  

      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, 
        int pos, long id) {       
       dListener.onFormatChanged(parent.getItemAtPosition(pos).toString(), data.get(position).getName());    
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       // TODO Auto-generated method stub    
      } 

     }); 

     holder.quantity.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void afterTextChanged(Editable s) { } 

       @Override  
       public void beforeTextChanged(CharSequence s, int start, 
       int count, int after) { } 

       @Override  
       public void onTextChanged(CharSequence s, int start, 
       int before, int count) { 
        dListener.onQuantityChanged(s.toString(), data.get(position).getName()); 
       } 
       }); 

     */ 

     return row; 
     } 




     //Interface to send selected image's position for deletion 
     public void setDeleteImageListener(DeleteImageListener listener) { 
      this.dListener = listener; 
     } 

     public static interface DeleteImageListener { 
      public void onDeletePressed(int position); 
      public void onQuantityChanged(String quantity, String name); 
      public void onFormatChanged(String format, String name); 
     } 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
      // TODO Auto-generated method stub 
      System.out.println("state changed"); 
     } 


     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 
      // TODO Auto-generated method stub 
      System.out.println("scroleld"); 
     }    





    } 

ответ

2

Вы не зовем setOnScrollListener(this) где угодно. Сделайте это в конструкторе, и он должен работать нормально :-)

Где-то в вашем коде вы, вероятно, что-то вроде этого:

PhotosListViewAdapter adapter = new PhotosListViewAdapter(); 
someListView.setAdapter(adapter); 

Добавить

someListView.setOnScrollListener(adapter); 
+0

Отлично, чем кс. Но на что я должен его установить? Внутри моего адаптера у меня нет ссылки на мой список. –

+0

@EdmondTamas upvote и принять этот ответ, чтобы кто-то еще мог воспользоваться –

+0

@NajeebullahShah, он еще не совсем завершен. См. Мой комментарий выше. Как можно установить это в списке внутри адаптера? У меня нет ссылки на список. –

1

Вы можете реализовать свою активность или фрагмент где ваше listview используется с «OnScrollListener», а затем просто установите listview следующим образом:

listview.setOnScrollListener(this); 
+0

Привет, мне нужно это внутри моего адаптера listview. –

+0

Да Решение Kelevandos - это то, что вам нужно, я просто поставлю это, чтобы выделить варианты. –

+0

Но как я могу ссылаться на список в моем адаптере массива? –

Смежные вопросы