0

this onethis oneまたはthis one (および他の多くの...)

私は ArrayAdapter を持っていますが、いくつかのテキストビューを追加する単純な水平方向の LinearLayout を使用して、ビューをゼロから作成します。テキストビューの数とその重みは、リスト内の位置によって異なります。最初の行に 3 台、2 番目の行に 7 台、3 番目の行に 25 台の TV があり、データベースに応じてそれぞれの重みが異なります。

この場合、何も膨らませることができないので、 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);
        }
    }
}
4

2 に答える 2

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
    }
  }
于 2016-06-19T19:46:46.347 に答える
0

ArrayAdapter は、ビューのリサイクルを自動的に行います。したがって、Array Adapter の場合は自分で処理する必要はありません。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;
    }
于 2016-06-19T19:45:51.230 に答える