Is it possible to set adapter to a LinearLayout
?
I don\'t want to use ListView
since I am using ScrollView
.
so I am using Li
Yes you can by adding your own specific LinearLayout implementation to get child views from the adapter. However, my basic implementation will not provide all the view recycling code provided by the list view.
/**
* 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();
}
}
no you can't. What you can do is inflate the single row, and adding to the LinearLayout. In pseudo code:
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)
}