是否可以将适配器设置为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);
答案 0 :(得分:26)
不,你不能。你可以做的是膨胀单行,并添加到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)
}
答案 1 :(得分:18)
是的,您可以通过添加自己的特定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();
}
}