是否可以将适配器设置为线性布局?

sha*_*459 22 android scrollview android-layout

是否可以将适配器设置为LinearLayout

ListView因为我正在使用,所以我不想使用ScrollView.所以我用LinearLayout...

在那我是动态添加视图,现在我需要使用适配器..所以任何人有任何建议?

我这样做......

LinearLayout clientList = (LinearLayout) findViewById(R.id.clients);
adapter = new Sample1AdapterActivity(this, arrayList);
View list = (ListView) getLayoutInflater().inflate(R.layout.user_details, getListView(), false);
Run Code Online (Sandbox Code Playgroud)

Bla*_*elt 29

不,你不能.你可以做的是膨胀单行,并添加到LinearLayout.在伪代码中:

  LinearLayout linearLayout = (LinearLayout) findViewById(...);
  LayoutInflater inflater = LayoutInflater.from(this);
  for (item in arrayList) {
     View view  = inflater.inflate(R.layout.row, linearLayout, false); 
     // set item content in view
     linearLayout.addView(view)
  }
Run Code Online (Sandbox Code Playgroud)


Vin*_*rat 19

是的,您可以通过添加自己的特定LinearLayout实现来从适配器获取子视图.但是,我的基本实现不会提供列表视图提供的所有视图回收代码.

/**
 * A linear layout that will contain views taken from an adapter. It differs
 * from the list view in the fact that it will not optimize anything and
 * draw all the views from the adapter. It also does not provide scrolling.
 * However, when you need a layout that will render views horizontally and
 * you know there are not many child views, this is a good option.

 *
 * @author Vincent Mimoun-Prat @ MarvinLabs
 */
public class AdapterLinearLayout extends LinearLayout {

    private Adapter adapter;
    private DataSetObserver dataSetObserver = new DataSetObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            reloadChildViews();
        }
    };

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public AdapterLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setOrientation(LinearLayout.HORIZONTAL);
    }

    public AdapterLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(LinearLayout.HORIZONTAL);
    }

    public AdapterLinearLayout(Context context) {
        super(context);
        setOrientation(LinearLayout.HORIZONTAL);
    }

    public void setAdapter(Adapter adapter) {
        if (this.adapter == adapter) return;
        this.adapter = adapter;
        if (adapter != null) adapter.registerDataSetObserver(dataSetObserver);
        reloadChildViews();
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (adapter != null) adapter.unregisterDataSetObserver(dataSetObserver);
    }

    private void reloadChildViews() {
        removeAllViews();

        if (adapter == null) return;

        int count = adapter.getCount();
        for (int position = 0; position < count; ++position) {
            View v = adapter.getView(position, null, this);
            if (v != null) addView(v);
        }

        requestLayout();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案!但是有一个问题 - 作为一个Android菜鸟,你能告诉我为什么setOrientation(LinearLayout.HORIZONTAL); 似乎覆盖了我在XML中提供的VERTICAL方向?某种优先权? (3认同)