I would like to dynamically add ImageViews to my RelativeLayout through my Adapter. The code I have isn't producing any errors, however, the ImageViews are not being created (confirmed using Hierarchy View).
The code that I'm using to add the ImageView is in the OnBindViewHolder() method.
// 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();
}
I've tried to accomplish this through the getView() method but it seems as if the getView() function wasn't being called, for some reason.
You are adding your image to a Relative layout but this relative layout isn't added to your view.
In onCreate, you should keep a reference to the view that inflate R.layout.rally
by setting the root element must have an android:id="@+id/view"
. (without your xml file, I'm not sure, but seems you used a relative layout as root element)
Then into your viewholder add :
public RelativeLayout relativeLayout;
relativeLayout = (RelativeLayout) itemView.findById(R.id.view);
Then in onBindViewHolder, put after rallyLayout.addView(viewHolder.image);
viewHolder.relativeLayout.addview(rallyLayout)
You may also have to adjust the layout parameters but seems you know how to do.
Just a little comment, try to not mix layout parameters even if they produce the same result RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments