2015-06-23 7 views
0

У меня есть ListView и пользовательский адаптер. Теперь у меня есть красные сообщения о методе getView(), вызываемом несколько раз, и большинство из них связано с функцией wrap_contentListView.Listview - Getview вызывается несколько раз

Я изменил свой рост, так что это может быть match_parent, но все же метод вызывается.

Я думаю, что это связано с динамическим добавлением TextView с адаптером, и я не знаю, как это сделать, поэтому он работает правильно.

Если есть альтернатива, я открыт к ней, единственная причина, по которой я поставил TextView, - это то, что я могу писать буквы разных цветов.

Вот мой код:

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View v = convertView; 
     Row current = mList.get(position); 

     /* if the given channel row view is not being updated*/ 
     if (v == null) 
     { 
     /* inflate layout */ 
      LayoutInflater vi = LayoutInflater.from(getContext()); 
      v = vi.inflate(R.layout.list_item2, null,false); 
     } 

     v = setLinearLayout(v,current); 

    return v; 
} 

Вот setLinearLayout() метод:

private View setLinearLayout(View v,Row current) { 

    ArrayList<Integer> winResults = current.checkNumbers(mResult,mType); 
    int numbers[] = current.getNumbers(); 

    int N = Global.getNumberOfNumbers(mType); 
    boolean FLAG_SET = false; 

    final TextView[] myTextViews = new TextView[N]; // create an empty array; 

    for (int i = 0; i < N; i++) { 
     Log.d("PAVLE",""+i+" row is: "+current.getStringNumbers()); 
     // create a new textview 
     final TextView rowTextView = new TextView(v.getContext()); 

     LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,75); 
     rowTextView.setTextSize(24.0f); 
     rowTextView.setPadding(8, 8, 8, 8); 
     rowTextView.setGravity(Gravity.CENTER); 
     rowTextView.setBackgroundColor(Color.BLACK); 
     rowTextView.setTypeface(null, Typeface.BOLD); 
     rowTextView.setLayoutParams(lp); 

     if(mType == R.string.sans_topu && i == 5 && !FLAG_SET){ 
      i--; 
      rowTextView.setTextColor(Color.WHITE); 
      rowTextView.setText("+"); 
      FLAG_SET = true; 
     } 
     else { 
      // set some properties of rowTextView or something 
      if (mWin == Global.WIN || mWin == Global.LOSE) { 
       if (winResults.contains(numbers[i])) 
        rowTextView.setTextColor(Color.GREEN); 
       else rowTextView.setTextColor(Color.RED); 
      } else { 
       rowTextView.setTextColor(Color.WHITE); 
      } 
      if (numbers[i] < 10) { 
       rowTextView.setText("0" + numbers[i]); 
      } else rowTextView.setText("" + numbers[i]); 
     } 
     // add the textview to the linearlayout 
     LinearLayout ll = (LinearLayout) v.findViewById(R.id.ll_item); 
     ll.addView(rowTextView); 

     // save a reference to the textview for later 
     myTextViews[i] = rowTextView; 
    } 

    final TextView prize = new TextView(v.getContext()); 
    LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,75); 
    prize.setTextSize(24.0f); 
    prize.setPadding(8, 8, 8, 8); 
    prize.setGravity(Gravity.CENTER); 
    prize.setBackgroundColor(Color.BLACK); 
    prize.setTypeface(null, Typeface.BOLD); 
    prize.setTextColor(Color.WHITE); 
    prize.setLayoutParams(lp); 

    try { 
     String cash = findCorretAmmount(winResults, numbers); 
     prize.setText(cash); 
     mTotal.append(" "+cash); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 

    LinearLayout ll = (LinearLayout) v.findViewById(R.id.ll_item); 
    ll.addView(prize); 

    return v; 
} 

И немного XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

<TextView 
    android:id="@+id/tvRandomTextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="16dp" 
    android:paddingRight="8dp" 
    android:text="@string/your_ticket_numbers_" 
    android:textColor="@android:color/black" 
    android:textSize="28sp" 
    android:textStyle="bold" 
    /> 

<View 
    android:id="@+id/divider4" 
    android:layout_width="match_parent" 
    android:layout_height="1dp" 
    android:layout_below="@id/tvRandomTextView" 
    android:layout_marginBottom="4dp" 
    android:layout_marginTop="4dp" 
    android:background="@android:color/darker_gray"/> 


<ListView 
    android:id="@+id/lvRowList" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@id/divider4" 
    /> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:paddingBottom="16dp" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    > 

    <Button 
     android:id="@+id/btnDelete" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:text="@string/delete"/> 

    <Button 
     android:id="@+id/btnShare" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:text="@string/btn_share"/> 


    <Button 
     android:id="@+id/btnDone" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:text="@string/done"/> 
</RelativeLayout> 

<TextView 
    android:id="@+id/tvResultLink" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="4dp" 
    android:layout_marginTop="4dp" 
    android:autoLink="web" 
    android:gravity="center" 
    android:linksClickable="true" 
    /> 

Также стоит мне что list_item2 (LinearLayout) имеет высоту 100dp, фиксированный размер.

ответ

1

Я думаю, что это не текст. getView всегда вызывается несколько раз. Если на экране будет отображаться 10 элементов, getView будет называться 15 раз, потому что андроид создает представления, которые не отображаются на экране. Это хорошо, потому что когда пользователь начнет прокрутку, он не будет отставать.

После того, как пользователь оставил элемент, вид get `recycle и повторно используется адаптером. Допустим, у вас есть список с номером 10000000, но у вас есть 5 элементов на экране в любое время. В этом случае - чтобы сэкономить энергию и повысить производительность - андроид собирается создать 10 элементов списка, и этот 10 элементов будут повторно использоваться и обновляться по контенту.

ViewHolder модель Пожалуйста, прочитайте это и использовать эту скороговорку, чтобы улучшить производительность кода: http://developer.android.com/training/improving-layouts/smooth-scrolling.html

Google о ListView: http://developer.android.com/guide/topics/ui/layout/listview.html

Учебники: http://developer.xamarin.com/guides/android/user_interface/working_with_listviews_and_adapters/

+0

Спасибо я возьму взгляд. (: –

+0

Это мое удовольствие, не торопитесь. Если мои ссылки были полезны, не стесняйтесь принимать и спрашивать больше :) – Karoly

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