2013-11-13 2 views
2

В моем приложении у меня есть GridView внутри ViewPager.Почему мой адаптер getView() выполняет бесконечные времена?

Я никого не использую match_parent или wrap_content. Я использую такие значения, как 200dp или 150dp. Итак, почему мой getView() адаптер GridView вызывает несколько раз?

Я искал много, как here, here, here и here.

Это мой класс адаптера.

public class CustomGridViewAdapter1 extends BaseAdapter { 
    ArrayList<Integer> list2 = new ArrayList<Integer>(); 
    private LayoutInflater mInflater; 

    public CustomGridViewAdapter1(Context context, ArrayList<Integer> list2) { 
     mInflater = LayoutInflater 
       .from(context.getApplicationContext()); 
     this.list2 = list2; 
    } 

    @Override 
    public int getCount() { 
     return 6; 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     try { 
      View hView = convertView; 
      if (convertView == null) { 
       hView = mInflater.inflate(R.layout.greeditem, null); 
       ViewHolder1 holder = new ViewHolder1(); 
       holder.song_pic = (ImageView) hView.findViewById(R.id.pic1); 
       holder.name = (TextView) hView 
         .findViewById(R.id.tabletext1); 
       holder.layout = (LinearLayout) hView 
         .findViewById(R.id.bingo_rlayout1); 
       hView.setTag(holder); 
      } 

      ViewHolder1 holder = (ViewHolder1) hView.getTag(); 
      imageLoader.DisplayImage(list1.get(position), holder.song_pic); 
      holder.name.setText(list.get(position)); 
      if (list2.get(position) == 1) { 
       holder.layout.setBackgroundColor(getActivity() 
         .getResources().getColor(R.color.lightblue)); 
       holder.name.setTextColor(getActivity().getResources().getColor(R.color.white)); 
      } 

      return hView; 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

И это мой XML макет:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <GridView 
     android:id="@+id/gridView1" 
     android:layout_width="320dp" 
     android:layout_height="250dp" 
     android:layout_below="@+id/ticketText" 
     android:numColumns="2" 
     android:background="#fff" 
     android:listSelector="@android:color/white"> 

    </GridView> 

    <TextView 
     android:id="@+id/scoreId" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/ticketText" 
     android:layout_alignBottom="@+id/ticketText" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="32dp" 
     android:text="Score 1/6" 
     android:textColor="#000000" 
     android:textSize="16sp" /> 

    <TextView 
     android:id="@+id/ticketText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/tablayout" 
     android:layout_marginLeft="16dp" 
     android:text="My Ticket #1" 
     android:textColor="#000000" 
     android:textSize="16sp" /> 

</RelativeLayout> 

ответ

2

Нам нужно проверить нулевое состояние в getView(). Попробуйте с ниже код:

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

    ViewHolderItem viewHolder; 

    /* 
    * The convertView argument is essentially a "ScrapView" as described is Lucas post 
    * http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/ 
    * It will have a non-null value when ListView is asking you recycle the row layout. 
    * So, when convertView is not null, you should simply update its contents instead of inflating a new row layout. 
    */ 
    if(convertView==null){ 

     // inflate the layout 
     LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
     convertView = inflater.inflate(layoutResourceId, parent, false); 

     // well set up the ViewHolder 
     viewHolder = new ViewHolderItem(); 
     viewHolder.textViewItem = (TextView) convertView.findViewById(R.id.textViewItem); 

     // store the holder with the view. 
     convertView.setTag(viewHolder); 

    }else{ 
     // we've just avoided calling findViewById() on resource everytime 
     // just use the viewHolder 
     viewHolder = (ViewHolderItem) convertView.getTag(); 
    } 

    // object item based on the position 
    ObjectItem objectItem = data[position]; 

    // assign values if the object is not null 
    if(objectItem != null) { 
     // get the TextView from the ViewHolder and then set the text (item name) and tag (item ID) values 
     viewHolder.textViewItem.setText(objectItem.itemName); 
     viewHolder.textViewItem.setTag(objectItem.itemId); 
    } 

    return convertView; 

} 
+1

Я думаю, что там могут быть некоторые другие problem.I использовали ур код, но получил тот же result.Can сказать, у меня, почему это happens.wt является причиной того, что GetView звонит бесконечное число раз. –

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