アダプタを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);
いいえ、できません。あなたができることは、単一の行を膨らませ、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)
}
はい、独自の特定の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();
}
}