Listview - Getview多次调用

时间:2015-06-23 09:52:49

标签: android listview android-listview

我有一个ListView和一个自定义适配器。现在,我发布了多次调用getView()方法的红色帖子,其中大多数都与wrap_content的{​​{1}}功能有关。

我已经改变了我的身高,所以它可以是ListView,但仍然会调用该方法。

我认为这与在适配器中动态添加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()

还有一点XML:

 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;
}

另外值得一提的是<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" /> (LinearLayout)的高度为100dp,它是固定大小。

1 个答案:

答案 0 :(得分:1)

我认为它不是关于textview。 getView总是被多次调用。如果要在屏幕上显示10个项目,则getView将被调用15次,因为android创建的视图不在屏幕上。这很好,因为当用户开始滚动时,它不会滞后。

用户离开项目后,视图将被回收并由适配器重用。可以说,你有一个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/