2

我想通過我的Adapter動態地將ImageViews添加到我的RelativeLayout。我擁有的代碼不會產生任何錯誤,但是,ImageViews不會被創建(使用層次結構視圖進行確認)。如何使用適配器動態添加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中,您應該保留對通過設置根元素必須有android:id="@+id/view"來使R.layout.rally膨脹的視圖的引用。 (沒有你的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一個'viewHolder.image'成員,除非你想要保留基準最後圖像創建。 – headuck