2

Я хотел бы динамически добавлять ImageViews в свой RelativeLayout через мой адаптер. Код, который у меня есть, не вызывает никаких ошибок, однако ImageViews не создаются (подтверждается с помощью Hierarchy View).Как динамически добавлять ImageView в макет с помощью адаптера

Код, который я использую для добавления ImageView, находится в методе OnBindViewHolder().

// Create the basic adapter extending from RecyclerView.Adapter 
// Note that we specify the custom ViewHolder which gives us access to our views 

public class RallyAdapter extends RecyclerView.Adapter<RallyAdapter.ViewHolder> { 

// Provide a direct reference to each of the views within a data item 
// Used to cache the views within the item layout for fast access 

public static class ViewHolder extends RecyclerView.ViewHolder{ 
    // Your holder should contain a member variable 
    // for any view that will be set as you render a row 
    public TextView nameTextView; 
    public TextView dateTextView; 
    public TextView creatorTextView; 
    public ImageButton thumbnail; 
    public ImageView image; 
    public RelativeLayout relativeLayout; 

    // We also create a constructor that accepts the entire item row 
    // and does the view lookups to find each subview 
    public ViewHolder(View itemView) { 
     // Stores the itemView in a public final member variable that can be used 
     // to access the context from any ViewHolder instance. 
     super(itemView); 

     relativeLayout = (RelativeLayout) itemView.findById(R.id.view); 
     nameTextView = (TextView) itemView.findViewById(R.id.name); 
     dateTextView = (TextView) itemView.findViewById(R.id.date); 
     thumbnail = (ImageButton) itemView.findViewById(R.id.imageButton); 
     creatorTextView = (TextView) itemView.findViewById(R.id.creator_name); 
    } 
} 

// Store a member variable for the contacts 
private ArrayList<Rally> mRallys; 
private Context mContext; 

// Pass in the contact array into the constructor 
public RallyAdapter(Context context, ArrayList<Rally> rallys) { 
    this.mRallys = rallys; 
    this.mContext = context; 
} 

// Usually involves inflating a layout from XML and returning the holder 
@Override 
public RallyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    Context context = parent.getContext(); 
    LayoutInflater inflater = LayoutInflater.from(context); 

    // Inflate the custom layout 
    View rallyView = inflater.inflate(R.layout.rally, parent, false); 

    // Return a new holder instance 
    ViewHolder viewHolder = new ViewHolder(rallyView); 

    return viewHolder; 
} 

// Involves populating data into the item through holder 
@Override 
public void onBindViewHolder(RallyAdapter.ViewHolder viewHolder, final int position) { 

    // Get the data model based on position 
    final Rally rally = mRallys.get(position); 

    TextView dateTV = viewHolder.dateTextView; 

    ImageButton imageButton = viewHolder.thumbnail; 

    Picasso.with(mContext).load(rally.getThumbnail()).fit().centerCrop().into(imageButton); 

    List<String> image_urls = rally.getTransportationImgs(); 
    List<String> methods = rally.getTransportationStrs(); 

    Log.d("IMG URLS", image_urls.toString()); 

    for (int i = 0; i < methods.size(); i++) { 

     String method = methods.get(i); 

     for (int j = 0; j < image_urls.size(); j++) { 

      String img_url = image_urls.get(j); 

      if (img_url.toLowerCase().contains(method.toLowerCase()) == true) { 

       viewHolder.image = new ImageView(mContext); 
       dateTV = viewHolder.dateTextView; 
       imageButton = viewHolder.thumbnail; 

       RelativeLayout rallyLayout = new RelativeLayout(mContext); 
       RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT); 

       params.addRule(RelativeLayout.RIGHT_OF, imageButton.getId()); 
       params.addRule(RelativeLayout.BELOW, dateTV.getId()); 
       params.addRule(RelativeLayout.END_OF, imageButton.getId()); 
       params.height = 65; 
       params.width = 65; 

       viewHolder.image.setLayoutParams(params); 

       rallyLayout.addView(viewHolder.image); 

       viewHolder.relativeLayout.addview(rallyLayout); 

       Picasso.with(mContext).load(img_url).fit().centerCrop().into(viewHolder.image); 
      } 
     } 
    } 
} 

@Override 
public int getItemCount() { 
    // TODO Auto-generated method stub 
    return mRallys.size(); 
} 

Я пытался сделать это с помощью метода GetView(), но это, кажется, как будто функция GetView() не вызывается, по какой-то причине.

ответ

0

Вы добавляете свое изображение в относительную компоновку, но этот относительный макет не добавляется к вашему представлению.

В onCreate вы должны сохранить ссылку на представление, которое надувает R.layout.rally, установив корневой элемент, должен иметь android:id="@+id/view". (Без файла XML, я не уверен, но, кажется, вы использовали относительное расположение, как корневой элемент)

Затем в ваш viewholder добавить:

public RelativeLayout relativeLayout; 

relativeLayout = (RelativeLayout) itemView.findById(R.id.view); 

Тогда в onBindViewHolder, положить после rallyLayout.addView(viewHolder.image);

viewHolder.relativeLayout.addview(rallyLayout) 

Возможно, вам также придется отрегулировать параметры макета, но, похоже, вы знаете, как это сделать.

Просто немного комментария, старайтесь не смешивать параметры макета, даже если они дают одинаковый результат RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

+0

Вы можете даже не нужен 'члена viewHolder.image' для viewHolder, если вы хотите сохранить ссылку на последний изображение создано. – headuck

Смежные вопросы