2013-10-18 36 views
2

我用自定義適配器做了一個listview。有五個文字瀏覽,一個複選框和一個按鈕。自定義listView重複值並在滾動上更改它們

------------------------------------- 
    <TextView> 
    <TextView> <checkbox> 
    <TextView> 
    <TextView> <button> 
    <TextView> 
------------------------------------- 

我用來填充列表中textview的arraylist具有適當的唯一數據。但是listview只需要四到五個開始值,並在列表的其餘部分重複。

另外,當我滾動顯示的值自動變化。例如,項目A顯示在第一個位置。因此,當我向下滾動然後再次上來時,會顯示項目C或項目D.

這真的讓我困惑!請幫忙!

定義適配器代碼

protected class MyCustomAdapter extends ArrayAdapter<String> 
{ 
    int len; 
    private SparseBooleanArray mCheckStates; 
    private SparseBooleanArray favourites; 

    ArrayList<String> myMake, myModel, myVer, myPrice, myPlace, sellr_pos; 
    int count = 0; 
    ViewHolder holder = null; 
    Boolean status; 

    public MyCustomAdapter(Context context, int textViewResourceId, 

    ArrayList<String> car_make, ArrayList<String> car_model, 
      ArrayList<String> car_version, ArrayList<String> car_price, 
      ArrayList<String> car_place, ArrayList<String> sellr_pos) { 
     super(context, textViewResourceId); 

     mCheckStates = new SparseBooleanArray(car_model.size()); 
     favourites = new SparseBooleanArray(car_model.size()); 

     myMake = car_make; 
     myModel = car_model; 
     myVer = car_version; 
     myPrice = car_price; 
     myPlace = car_place; 

    } 

    private class ViewHolder { 
     TextView txt1, txt2, txt3, txt4, txt5; 
     CheckBox chkbox; 
     Button btn_fav; 
    } 

    @Override 
    public int getCount() { 
     return myMake.size(); 
    } 

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

     if (convertView == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.text_adaptr, null); 
      holder = new ViewHolder(); 

      holder.txt1 = (TextView) convertView.findViewById(R.id.text1); 
      holder.txt2 = (TextView) convertView.findViewById(R.id.text5); 
      holder.txt3 = (TextView) convertView.findViewById(R.id.text3); 
      holder.txt4 = (TextView) convertView.findViewById(R.id.text4); 
      holder.txt5 = (TextView) convertView.findViewById(R.id.text2); 

      System.out.println("ListView position: " + position); 

      holder.txt1.setText(myMake.get(position)); 
      holder.txt2.setText(myModel.get(position)); 
      holder.txt3.setText(myVer.get(position)); 
      holder.txt4.setText(myPrice.get(position)); 
      holder.txt5.setText(myPlace.get(position)); 

      holder.chkbox = (CheckBox) convertView 
        .findViewById(R.id.checkBox1); 
      holder.btn_fav = (Button) convertView.findViewById(R.id.fav); 

      convertView.setTag(holder); 

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

     holder.chkbox.setTag(position); 

     holder.chkbox.setChecked(mCheckStates.get(position, false)); 

     if (favourites.get(position, false)) { 

      holder.btn_fav.setBackgroundResource(R.drawable.star); 


     } else { 
      holder.btn_fav.setBackgroundResource(R.drawable.star_grey); 

     } 

     len = fav_ids.size(); 

     System.out.println("FAV_IDS len:" + len); 

     for (int t = 0; t < len; t++) { 

      String pos_id = pos.get(position).trim(); 
      String fav_id = fav_ids.get(t).trim(); 

      if (pos_id.equals(fav_id)) { 


       holder.btn_fav.setBackgroundResource(R.drawable.star); 

       break; 

      } else { 

       holder.btn_fav.setBackgroundResource(R.drawable.star_grey); 
      } 

     } 

     holder.chkbox.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 

      // Do something 

      } 
     }); 

     holder.btn_fav.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 

       // Do something 

      } 
     }); 

     return convertView; 
    } 
} 
+0

爲什麼不製作一個自定義的POJO類的適配器,像類MyCustomAdapter擴展ArrayAdapter ,其中CarInfo將是一個持有String對象(模型,版本,價格等)的類?它會簡化你的代碼,你甚至不需要在你的構造函數中使用6 ArrayList 。只是一個設計建議;-) – 2Dee

+0

是的,你是對的!但是現在它已經變得太大和複雜了......我的時間很少......但是我一定會在稍後嘗試改進它 – User3

回答

3

設置值的TextView的在

if (convertView == null) { 
....code... 
........../. 

/* 
you are setting values here 
remove it from here 
*/ 
holder.txt1.setText(myMake.get(position)); 
      holder.txt2.setText(myModel.get(position)); 
      holder.txt3.setText(myVer.get(position)); 
      holder.txt4.setText(myPrice.get(position)); 
      holder.txt5.setText(myPlace.get(position)); 
} 
else 
{ 
....code... 
} 


/* 
Set values here 
it will solve the problem 
*/ 
holder.txt1.setText(myMake.get(position)); 
      holder.txt2.setText(myModel.get(position)); 
      holder.txt3.setText(myVer.get(position)); 
      holder.txt4.setText(myPrice.get(position)); 
      holder.txt5.setText(myPlace.get(position)); 

它解決了我的問題

相關問題