2016-06-19 1 views
0

私はArrayAdapterを持っていますが、私は、最初からビューを作成膨らんでいないと、ArrayAdapterでconvertViewを使用する必要がありますか?

(...と他の多くの)this onethis oneまたはthis oneなどのアダプタでconvertViewを使用しての有用性に関するSOの記事の多くを見ます私はいくつかのtextviewsを追加する単純な水平LinearLayout。テキストビューの数とその重みは、リスト内の位置によって異なります。第1行には3つのテレビがあり、第2テレビには3つ、第3テレビには3つのテレビがあり、データベースに応じてそれぞれのテレビの体重が異なります。

この場合、私は何も膨らませることができないので、convertViewには何が含まれていますか?

私はそれを使うべきですか?はいの場合、どうすればいいですか?

編集:ここに私のコードです:

@Override 
public View getView(final int position, View convertView, ViewGroup parent){ 
    LinearLayout layout = new LinearLayout(context); 
    for (int i = 0; i < totalTVNumber; i++) { 
     LifeEvent event = getEventFromDB(cost, position); 
     if (event != null) { 
      TextView eventTV = event.getTextView(getContext()); 
      eventTV.setLayoutParams(new LinearLayout.LayoutParams(0, 100, weight));//0 en width sinon weight n'est pas pris en compte !! 
      layout.addView(eventTV); 
     } 
    } 
} 
+0

あなたがゼロから作成するには、このビューを膨張させることではないでしょうか? –

+0

いいえ、テレビの量と重量はデータベースとリストの位置によって異なります –

+0

コードにreturn view文がないのはなぜですか?これは正しくコンパイルエラーですか? –

答えて

0

ArrayAdapterは自動的にあなたのためのビューのリサイクルを行います。したがって、アレイアダプターの場合には、自分で処理する必要はありません。 ArrayAdapter.javaから取得した以下のコードを参照してください。あなたはこれから明快さを得るかもしれません。

public View getView(int position, View convertView, ViewGroup parent) { 
     return createViewFromResource(mInflater, position, convertView, parent, mResource); 
    } 

    private View createViewFromResource(LayoutInflater inflater, int position, View convertView, 
      ViewGroup parent, int resource) { 
     View view; 
     TextView text; 

     if (convertView == null) { 
      view = inflater.inflate(resource, parent, false); 
     } else { 
      view = convertView; 
     } 

     try { 
      if (mFieldId == 0) { 
       // If no custom field is assigned, assume the whole resource is a TextView 
       text = (TextView) view; 
      } else { 
       // Otherwise, find the TextView field within the layout 
       text = (TextView) view.findViewById(mFieldId); 
      } 
     } catch (ClassCastException e) { 
      Log.e("ArrayAdapter", "You must supply a resource ID for a TextView"); 
      throw new IllegalStateException(
        "ArrayAdapter requires the resource ID to be a TextView", e); 
     } 

     T item = getItem(position); 
     if (item instanceof CharSequence) { 
      text.setText((CharSequence)item); 
     } else { 
      text.setText(item.toString()); 
     } 

     return view; 
    } 
+0

私はaffraidです。私はAndroidのコードを完全に理解するための初心者の多くにまだいます... –

2

いただきましconvertViewは含まれていませんか?

これは、スクラッチから作成した過去のViewを含み、画面からスクロールしてリサイクル対象となります。

私はそれを使用しますか?

はい、してください。

もしそうなら、どうすればいいですか?

他の人と同じ方法です。インフレーションではなくダイレクトにビューを作成しているということは重要ではありません。

だから、あなたはこのような何かを行うことができます。

class YourAdapter extends ArrayAdapter<Whatever> { 
    @Override 
    public View getView(int position, View convertView, 
          ViewGroup parent) { 
     if (convertView==null) { 
     convertView=newView(parent); 
     } 

     bindView(position, convertView); 

     return(convertView); 
    } 

    private View newView(ViewGroup parent) { 
     // create and return your new View 
    } 

    private void bindView(int position, View row) { 
     // populate the widgets of your new or recycled view 
    } 
    } 
+0

OK、convertviewにはtextviewsのある直線レイアウトが含まれています。 convertViewを使用することは、レイアウトを取得し、textviewsを削除し、他のものを追加するようなものです。どのようにその価値がありますか? (または多分私は何かを得られなかった:s) –

+0

@ DanChaltiel: "convertViewを使用するレイアウトのようなものです、textviewsを削除し、他のものを追加する" - いいえ。 'TextViews'を取得して' setText() 'を呼び出すと、既存のテキストを新しいテキストに置き換えます。回答のコードスケルトンで、 'row'がインフレーション、リサイクルから来たものであれ、まったく新しいものであれ、あなたは' bindView() 'でその作業を行います。 'TextView'ウィジェットへのアクセスを簡素化したい場合は、[view-holderパターン](https://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder)を自由に使用してください。 – CommonsWare

+0

私の悪い、私は十分な詳細を追加しませんでしたが、私は@ Farbodと言ったように、私のtextviewsの数と重量は、リストの位置によって異なります。あなたの投稿を理解しているようなものだったら、XMLから膨らませる方がいいでしょうか? –

関連する問題