How to add same view to parent multiple times by inflating it only once
Solution 1
Did you actually check if inflate is slow? As far as I know, inflating view is very fast (almost as fast as creating views manually).
It might be surprising for you to hear but inflate in fact does not parse the XMLs at all. XMLs for layout are parsed and pre-processed at compile time - they are stored in a binary form which makes view inflation very efficient (that's why you cannot inflate a view from an XML generated at runtime).
Solution 2
You can't, even if you try to create a new view
from the old view
object the object will be passed by reference not value, and hence you will got an Exception as the childAlreadyHasParent, and so, the only way is to put the view
into a for loop
with the number of times you want it to be inflated, and this loop must contain the creating process from beginning not only the inflating lines.
Solution 3
I'm not sure what your view is but have you creating it manually over inflating the XML:
ArrayList<String> myList = getData();
for(String data : myList) {
LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
TextView textView = new TextView(this);
textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
textView.setText(data);
layout.addChild(textView);
parentPanel.addView(layout);
}
But yeah your clearly attempting something that has been done for you with Simple ListView & API
Solution 4
Inflating multiple times cannot be done the same way doing it in single shot. Hope this works
LayoutInflater inflator = (LayoutInflater).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout parentPanel = findViewById(R.id.parent_pannel);
ArrayList<String> myList = getData();
for(String data : myList) {
// inflate child
View item = inflator.inflate(R.layout.list_item, null);
// initialize review UI
TextView dataText = (TextView) item.findViewById(R.id.data);
// set data
dataText.setText(data);
// add child
parentPanel.addView(item);
}
This will work, at the least worked me
mkso
A Software Engineer focused on mobile application development, right now working on Android apps.
Updated on April 14, 2020Comments
-
mkso about 4 years
I have a LinearLayout with vertical orientation as parent, I want to add some view programmatically multiple times to this parent. Right now I am inflating the child every time getting new references to every UI element before adding to parent. This doesn't seem to be very efficient, is there any better way of doing this.
Current code I am using is below, If I inflate only once before for loop I get runtime error "he specified child already has a parent. You must call removeView() on the child's parent first."
LayoutInflater inflator = LayoutInflater.from(getBaseContext()); LinearLayout parentPanel = findViewById(R.id.parent_pannel); ArrayList<String> myList = getData(); for(String data : myList) { // inflate child View item = inflator.inflate(R.layout.list_item, null); // initialize review UI TextView dataText = (TextView) item.findViewById(R.id.data); // set data dataText.setText(data); // add child parentPanel.addView(item); }
-
Teodor over 11 years
-
Moses Villamor almost 11 yearsWorked for me as well with View v = inflater.inflate(R.layout.list_item, parent, false) followed later by calling addView(v). Looks like inflate(...) might have an optimization to not attach if its already there.
-
Yoann Hercouet almost 8 yearsI don't agree on that, during my activities or fragments creations, the XML inflation is always what requires the longest time, that's why I try to keep the layout structure as simple as possible.
-
Jarek Potiuk almost 8 yearsMy point is that If you have many-level-nested layout, it will be slow regardless if it's done by hand or by inflation. So I agree you should keep the layout as simple as possible (and preferably after latest Google I/O 16 we will all soon move to much simpler/less nested Constrained Layouts). My only point was that there is no XML parsing involved, so parsing is not a problem.
-
Yoann Hercouet almost 8 years@JarekPotiuk Thanks for the clarification!
-
Vivek Pratap Singh almost 8 yearscan you suggest me something if i have to add dynamically view same as above inside a recycler view row