It is necessary in ListView , in each item to display a different number of View-elements (for this ListView, in each item there is a different number of songs).
The option to create it programmatically in a loop, I would like to know about the correct implementation.

I do this:

 public View getView(final int position, View convertView, ViewGroup viewGroup) { ViewHolder viewHolder; if (convertView == null){ LayoutInflater inflater = (LayoutInflater)ctx .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.internetlist, viewGroup, false); viewHolder = new ViewHolder(); viewHolder.txtItem = (TextView) convertView.findViewById(R.id.internetlistText); viewHolder.image = (ImageView)convertView.findViewById(R.id.internetlistImageView1); viewHolder.layot = (LinearLayout)convertView.findViewById(R.id.internetlistLinearLayout1); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } //viewHolder.txtItem.setText(objects.get(position).getItems().get(0).getUrl()); if (viewHolder.image!=null){ //new DownloadImageTask(viewHolder.image).execute(objects.get(position).getItems().get(0).getUrl()); viewHolder.txtItem.setText(objects.get(position).getItems().get(1).getArtist()); ImageLoader.getInstance().displayImage(objects.get(position).getItems().get(0).getUrl(),viewHolder.image,options); for (int i =1;i<objects.get(position).getItems().size();i++){ Button b = new Button(ctx); b.setBackgroundResource(R.color.ffffff); b.setTextSize(15); b.setText(objects.get(position).getItems().get(i).getArtist() + " " +objects.get(position).getItems().get(i).getTitle()); viewHolder.layot.addView(b); } } return convertView; 

Buttons are created, filled in correctly, only when scrolling there are extra lists (for example, in the first item is the first list of songs and in the same place the third or fifth one and so on everywhere). Maybe this is due to the re-creation of the item ?

And one more question. Can my dynamically created buttons be stored in Holder ?

  • If you got the viewholder from the tag, then you need to call viewHolder.layot ​​removeAllViews - SorryForMyEnglish

2 answers 2

Do it like it works

  public View getView(final int position, View convertView, ViewGroup viewGroup) { ViewHolder viewHolder; if (convertView == null){ LayoutInflater inflater = (LayoutInflater)ctx .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.internetlist, viewGroup, false); viewHolder = new ViewHolder(); viewHolder.txtItem = (TextView) convertView.findViewById(R.id.internetlistText); viewHolder.image = (ImageView)convertView.findViewById(R.id.internetlistImageView1); viewHolder.layot = (LinearLayout)convertView.findViewById(R.id.internetlistLinearLayout1); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } //viewHolder.txtItem.setText(objects.get(position).getItems().get(0).getUrl()); if (viewHolder.image!=null){ viewHolder.layot.removeAllViews(); //new DownloadImageTask(viewHolder.image).execute(objects.get(position).getItems().get(0).getUrl()); viewHolder.txtItem.setText(objects.get(position).getItems().get(1).getArtist()); ImageLoader.getInstance().displayImage(objects.get(position).getItems().get(0).getUrl(),viewHolder.image,options); for (int i =1;i<objects.get(position).getItems().size();i++){ View item = lInflater.inflate(R.layout.internetitemtitle, null, false); TextView t = ((TextView)item.findViewById(R.id.internetitemtitleTextView1)); TextView t1 = ((TextView)item.findViewById(R.id.internetitemtitleTextView2)); //Button b = new Button(ctx); //b.setBackgroundResource(R.color.ffffff); //b.setTextSize(15); //b.setGravity(Gravity.LEFT); //viewHolder.title.setFontFeatureSettings("sans-serif-thin"); //viewHolder.title.setText(position+""); t.setText(objects.get(position).getItems().get(i).getTitle()); t1.setText(objects.get(position).getItems().get(i).getArtist()); 

musicposit.item = position; musicposit.music = i; item.setTag (musicposit); viewHolder.layot.addView (item); }} return convertView;
static class MusicPosit {int item; int music; }

Now another problem, it turns out each item has a list of songs. When I click on a song, I need to catch two numbers: the item position and the song position in item.

  • use setTag for item, write a class that will store 2 fields, the position of the element and the position of the song. Before adding to the layout, install this object as a tag by analogy to the viewholder. when you click on an item you get a tag. - SorryForMyEnglish pm
  • Look at my answer, I updated, did as you said. And pull the data like that? MusicPosit musicposit = (MusicPosit) v.getTag (); - user186301
  • yes so if onkliklistener you hung on item - SorryForMyEnglish
  • When you try to bring musicposit.item knocks error. And another question, if the static class can have only one instance, i.e. Musicposit musicposit = (MusicPosit) v.getTag (); this is the musicposit that was written in settag - user186301
  • this is absolutely the object, the error is with you because you don’t see the tag and you get an NPE. - SorryForMyEnglish

For example, ListView set LinearLayout with vertical orientation android:orientation="vertical" for ListView elements. Already then, in the adapter, where the List your objects is transmitted, in turn, which have their lists with the names of the songs, and so on these lists, by loop, put them into your layout.

  • Updated the question, please see - user186301