2013-11-09 3 views
9

Я создаю пользовательский вид списка, используя baseadapter.i. У меня есть 10 элементов списка в моем списке. Проблема в том, что afetr 6 элементов, первые 4 повторяются. Я просто напечатал значения позиции в getview. он дает 0,1,2,3,4,5,6,7,8,9,0,1,2,3. Мой код ниже.Элемент позиции списка, повторяющийся в getview

спасибо заранее

public class ProductListAdapter extends BaseAdapter implements OnClickListener{  

/* 
* developer :sanu 
* date :10-4-2013 
* time :3.34 pm 
*/ 
public View row; 
private String[] productName; 
private String[] producttype; 
private String[] priceRangeFrom; 
private String[] priceRangeTo; 
private String[] productImage; 
private Activity activity; 
private static LayoutInflater inflater=null; 
static String posClicked; 
ViewHolder holder; 
Integer height1; 
Integer width1; 
Typeface tf; 
Integer FirmaCount; 
public ImageLoader imageLoader; 
public ProductListAdapter(Activity a,String[] name,String[] type,String[] price_from,String[] price_to,String[] image,Typeface tf) { 
    activity = a; 
    productName = name; 
    producttype = type; 
    priceRangeFrom = price_from; 
    priceRangeTo = price_to; 
    productImage = image;  
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader=new ImageLoader(activity.getApplicationContext()); 
} 
public int getCount() { 
    return productName.length; 
} 
public Object getItem(int position) { 
    return position; 
} 
public long getItemId(int position) { 
    return position; 
} 
public int getViewTypeCount (int position) 
{ 
    return position; 
} 
public static class ViewHolder{ 
    public TextView nameProduct; 
    public TextView typeProduct; 
    public TextView priceRangeProduct; 
    public ImageView productImage; 
    public ImageView plusImage; 
    public RelativeLayout mainLayout; 
    public int position; 
} 
public View getView(int position, View convertView, ViewGroup parent) {  
    if(convertView == null){    
     convertView = inflater.inflate(R.layout.product_list_details,parent, false); 
     holder=new ViewHolder(); 
     holder.nameProduct =(TextView)convertView.findViewById(R.id.name); 
     holder.typeProduct =(TextView)convertView.findViewById(R.id.product); 
     holder.priceRangeProduct =(TextView)convertView.findViewById(R.id.pricerange); 
     holder.productImage =(ImageView)convertView.findViewById(R.id.image); 
     holder.plusImage =(ImageView)convertView.findViewById(R.id.dot); 
     holder.mainLayout = (RelativeLayout)convertView.findViewById(R.id.mainlayout); 
     holder.nameProduct.setText(productName[position]);  
     if(producttype[position].length()>18) 
     { 
      holder.typeProduct.setText(producttype[position].substring(0,18)+"..."); 
     } 
     else 
     { 
      holder.typeProduct.setText(producttype[position]); 
     } 
     holder.priceRangeProduct.setText(priceRangeFrom[position].substring(0,priceRangeFrom[position].length()-2)+" To "+priceRangeTo[position].substring(0, priceRangeTo[position].length()-2));   
     imageLoader.DisplayImage(productImage[position], holder.productImage); 
     convertView.setTag(holder);      
    } 
    else 
    {   
     holder = (ViewHolder)convertView.getTag(); 

    }  
    holder.plusImage.setTag(Integer.toString(position)); 
    holder.plusImage.setOnClickListener(this); 
    holder.mainLayout.setTag(Integer.toString(position)); 
    holder.mainLayout.setOnClickListener(this); 
    return convertView; 
} 
+0

переместите этот 'holder.nameProduct.setText (productName [position]); если (тип продукта [положение]. Длина()> 18) { держатель.typeProduct.setText (тип продукта [позиция] .substring (0,18) + "..."); } прочее { держатель.typeProduct.SetText (ProductType [положение]); } 'ниже последнего и попробуйте – Raghunandan

+0

Я предлагаю расширить ArrayAdapter вместо этого, поскольку вы можете сделать то же самое действие, что и выше, с меньшими соображениями – ManZzup

ответ

6

Это звучит как случай View повторно cyclcing. Android передаст предварительно заполненный вид метода getView. Это делается для минимизации создания объекта. Когда текущий просмотр строки прокручивается с экрана, Android может попытаться переработать это представление, чтобы отобразить строку, которая теперь находится на экране. Вам необходимо учитывать тот факт, что это представление, возможно, использовалось для отображения данных для другой строки (которая теперь выключена).

Вы имеете следующую строку

holder.typeProduct.setText 

в следующих условных:

if(convertView == null){    

Переместить ту линию за пределами условного, и все должно быть хорошо.

1

Измените ваш getView на

public View getView(int position, View convertView, ViewGroup parent) {  
    if(convertView == null){    
     convertView = inflater.inflate(R.layout.product_list_details,parent, false); 
     holder=new ViewHolder(); 
     holder.nameProduct =(TextView)convertView.findViewById(R.id.name); 
     holder.typeProduct =(TextView)convertView.findViewById(R.id.product); 
     holder.priceRangeProduct =(TextView)convertView.findViewById(R.id.pricerange); 
     holder.productImage =(ImageView)convertView.findViewById(R.id.image); 
     holder.plusImage =(ImageView)convertView.findViewById(R.id.dot); 
     holder.mainLayout = (RelativeLayout)convertView.findViewById(R.id.mainlayout); 
     convertView.setTag(holder); 
     } else { 
     holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.nameProduct.setText(productName[position]);  
     if(producttype[position].length()>18) 
     { 
      holder.typeProduct.setText(producttype[position].substring(0,18)+"..."); 
     } 
     else 
     { 
      holder.typeProduct.setText(producttype[position]); 
     } 
     holder.priceRangeProduct.setText(priceRangeFrom[position].substring(0,priceRangeFrom[position].length()-2)+" To "+priceRangeTo[position].substring(0, priceRangeTo[position].length()-2));   
     imageLoader.DisplayImage(productImage[position], holder.productImage); 

     holder.plusImage.setTag(Integer.toString(position)); 
     holder.plusImage.setOnClickListener(this); 
     holder.mainLayout.setTag(Integer.toString(position)); 
     holder.mainLayout.setOnClickListener(this); 
     return convertView; 
} 

Также проверьте этот

How ListView's recycling mechanism works

+0

Thanx для вашего ответа .... но при прокрутке списка элементов я получил ошибку в \t holder = (ViewHolder) convertView.getTag(); – Sanu

+0

@Sanu Какая ошибка? – Raghunandan

+0

@ Sanu als, почему вам нужна 'public int position' в виде держателя? – Raghunandan

1

Изменить GetView()

Объявить ViewHolder перед тем if (convertView == null)

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.product_list_details, 
        parent, false); 
      holder = new ViewHolder(); 
      holder.nameProduct = (TextView) convertView.findViewById(R.id.name); 
      holder.typeProduct = (TextView) convertView 
        .findViewById(R.id.product); 
      holder.priceRangeProduct = (TextView) convertView 
        .findViewById(R.id.pricerange); 
      holder.productImage = (ImageView) convertView 
        .findViewById(R.id.image); 
      holder.plusImage = (ImageView) convertView.findViewById(R.id.dot); 
      holder.mainLayout = (RelativeLayout) convertView 
        .findViewById(R.id.mainlayout); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 

     } 
     holder.nameProduct.setText(productName[position]); 
     if (producttype[position].length() > 18) { 
      holder.typeProduct.setText(producttype[position].substring(0, 18) 
        + "..."); 
     } else { 
      holder.typeProduct.setText(producttype[position]); 
     } 
     holder.priceRangeProduct.setText(priceRangeFrom[position].substring(0, 
       priceRangeFrom[position].length() - 2) 
       + " To " 
       + priceRangeTo[position].substring(0, 
         priceRangeTo[position].length() - 2)); 
     imageLoader.DisplayImage(productImage[position], holder.productImage); 
     holder.plusImage.setTag(Integer.toString(position)); 
     holder.plusImage.setOnClickListener(this); 
     holder.mainLayout.setTag(Integer.toString(position)); 
     holder.mainLayout.setOnClickListener(this); 
     return convertView; 
    } 
+0

Привет amit ... при прокрутке я получаю ошибку ... – Sanu

+0

FATAL EXCEPTION: main java.lang.ClassCastException: java.lang.String не может быть добавлен в com.Adapter.ProductListAdapter $ ViewHolder om.Adapter.ProductListAdapter.getView (ProductListAdapter.java:87) android.widget.AbsListView.obtainView (AbsListView.java:2063) android.widget.ListView. makeAndAddView (ListView.java:1792) android.widget.ListView.fillDown (ListView.java:676) 11-09 12: 35: 29.339: E/AndroidRuntime (4245): at android.widget.ListView.fillGap (ListView.java : 640) – Sanu

+0

@Sanu вы можете мне сказать, в какой строке указывается ошибка. поделиться этой строкой кода. –

-1

Кажется, что вы написали код с неправильным синтаксисом. См на несколько пункт ниже:

  1. Вы должны переопределить каждый реализовать метод BaseAdapter: GetCount(), GetItem(), getItemId(), GetView()

  2. Смотрите на свой код ниже :

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

    Как вы считаете, это неправильно? изменить его к этому:

     
    @Override 
    public Object getItem(int position) { 
        return productName[position]; 
    } 
    
+0

thanx heri ... я только что сделал это изменение – Sanu

+0

, но у меня такая же проблема. .. – Sanu

3

Это как сказал EJK. Вы неправильно пересматриваете свое мнение. Измените свой код на это и сообщите, куда я положил вызовы setText

public View getView(int position, View convertView, ViewGroup parent) {  
if(convertView == null){    
    convertView = inflater.inflate(R.layout.product_list_details,parent, false); 
    holder=new ViewHolder(); 
    holder.nameProduct =(TextView)convertView.findViewById(R.id.name); 
    holder.typeProduct =(TextView)convertView.findViewById(R.id.product); 
    holder.priceRangeProduct =(TextView)convertView.findViewById(R.id.pricerange); 
    holder.productImage =(ImageView)convertView.findViewById(R.id.image); 
    holder.plusImage =(ImageView)convertView.findViewById(R.id.dot); 
    holder.mainLayout = (RelativeLayout)convertView.findViewById(R.id.mainlayout); 

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

}  
    holder.plusImage.setTag(Integer.toString(position)); 
    holder.plusImage.setOnClickListener(this); 
    holder.mainLayout.setTag(Integer.toString(position)); 
    holder.mainLayout.setOnClickListener(this); 

    //setText functions are here 
    holder.nameProduct.setText(productName[position]); 


    if(producttype[position].length()>18) 
    { 
     holder.typeProduct.setText(producttype[position].substring(0,18)+"..."); 
    } 
    else 
    { 
     holder.typeProduct.setText(producttype[position]); 
    } 
    holder.priceRangeProduct.setText(priceRangeFrom[position].substring(0,priceRangeFrom[position].length()-2)+" To "+priceRangeTo[position].substring(0, priceRangeTo[position].length()-2)); 

    imageLoader.DisplayImage(productImage[position], holder.productImage); 

    return convertView; 
} 
+0

Я просто делаю это изменение ... но при прокрутке я получаю ошибку – Sanu

+0

на прокрутке ошибки iget на этом держателе строки = (ViewHolder) convertView .getTag(); – Sanu

+0

Какая ошибка? – Wang

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