Android 如何动态创建listView?

Android 如何动态创建listView?,android,android-layout,listview,Android,Android Layout,Listview,我有一个任务,我必须制作一个列表视图,其中每一行都应该包含图像、标题和详细信息。但我需要以编程方式创建它,而不需要任何XML文件。所以我的问题是我做错了什么?以下是我的解决方案: // My custom View which represents the row of ListView public class CustomListItem extends LinearLayout{ //region Private fields private TextView listItem

我有一个任务,我必须制作一个列表视图,其中每一行都应该包含图像、标题和详细信息。但我需要以编程方式创建它,而不需要任何XML文件。所以我的问题是我做错了什么?以下是我的解决方案:

 // My custom View which represents the row of ListView   
 public class CustomListItem extends LinearLayout{

//region Private fields
private TextView listItemTitle_;
private TextView listItemDetails_;
private ImageView listItemImage_;
//endregion

//region Public constructors
public CustomListItem(Context context) {
    super(context);
    init(null, 0);
}

public CustomListItem(Context context, AttributeSet attributeSet) {
    super(context, attributeSet);
    init(attributeSet, 0);
}

public CustomListItem(Context context, AttributeSet attributeSet, int defStyle) {
    super(context, attributeSet, defStyle);
    init(attributeSet, defStyle);
}
//endregion

//region Accessors
public void setListItemTitle(String title) {
    this.listItemTitle_.setText(title);
}

public String getTitle() {
    return listItemTitle_.getText().toString();
}

public void setListItemDetails(String details) {
    this.listItemDetails_.setText(details);
}

public String getListItemDetails() {
    return listItemDetails_.getText().toString();
}

//endregion

private void init(AttributeSet attributeSet, int defStyle) {
    LinearLayout linearLayout = new LinearLayout(getContext());
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.setPadding(0, 70, 0, 0);
    listItemTitle_ = new TextView(getContext());
    listItemTitle_.setText("Title");

    listItemDetails_  = new TextView(getContext());
    listItemDetails_.setText("Details");

    listItemImage_ = new ImageView(getContext());
    listItemImage_.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.clear));

    addView(linearLayout);
    linearLayout.addView(listItemTitle_);
    linearLayout.addView(listItemDetails_);
}
}

这是我的适配器

   public class ItemAdapter extends ArrayAdapter<ItemInfo> {

public ItemAdapter(Context context, List<ItemInfo> items) {
    super(context, R.layout.custom_list_item, items);

}

@Override
public View getView(int postition,View convertView, ViewGroup parent){
    ItemInfo item = this.getItem(postition);
    CustomListItem customListItem_ = new CustomListItem(getContext());
    customListItem_.setListItemTitle(item.getTitle());
    customListItem_.setListItemTitle(item.getDescription());
    return convertView;
}
}

但是我不需要使用R.layout.custom\u list\u项,我需要使用我的customView而不是layout

这里是我在MainActivity中创建的代码

  @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    LinearLayout layout = new LinearLayout(getApplicationContext());
    ListView listView = new ListView(getApplicationContext());

    CustomListItem customListItem = new CustomListItem(getApplicationContext());

    List<ItemInfo> values = new ArrayList<ItemInfo>();
    Bitmap image = BitmapFactory.decodeResource(getResources(), R.mipmap.clear);
    ItemInfo info = new ItemInfo(image,"Hi","android");
    ItemInfo info2 = new ItemInfo(image,"Hi2","android");
    values.add(info);
    values.add(info2);

    Adapter_ = new ItemAdapter(this, values);

    setContentView(R.layout.activity_main);

    layout.addView(listView);
    setContentView(layout);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = new LinearLayout(getApplicationContext());
    layout.setOrientation(LinearLayout.VERTICAL);
    ListView listView = new ListView(this);

    listView.setPadding(0, (int)getResources().getDimension(R.dimen.list_item_top), 0, 0);

    listView.setDivider(null);

    List<ItemInfo> values = new ArrayList<ItemInfo>();
    Drawable image = getResources().getDrawable(R.mipmap.clear);

    for (int i = 0; i < 20; i++) {
        ItemInfo info = new ItemInfo(image, getResources().getString(R.string.title) + i, getResources().getString(R.string.details) + i);
        values.add(info);
    }

    Adapter_ = new ItemAdapter(this, values);
    listView.setAdapter(Adapter_);
    layout.addView(listView);
    setContentView(layout);
}
这里是主要的活动布局


必须将适配器设置为ListView

listView.setAdapter(Adapter_);
此外,该行:

getView应返回以下值:

@Override
public View getView(int postition,View convertView, ViewGroup parent){
    ItemInfo item = this.getItem(postition);
    CustomListItem customListItem_ = new CustomListItem(getContext());
    customListItem_.setListItemTitle(item.getTitle());
    customListItem_.setListItemTitle(item.getDescription());
    return customListItem;
}
这是我的适配器

 @Override
   public View getView(int position, View convertView, ViewGroup parent) {
    HorizontalScrollView horizontalScrollView = new HorizontalScrollView(getContext());

    LinearLayout layout = new LinearLayout(getContext());
    layout.setLayoutParams(new LinearLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
    ));

    float paddingLeft = getContext().getResources().getDimension(R.dimen.padding_left_for_image);
    layout.setPadding((int) paddingLeft, 0, 0, 0);

    ItemInfo item = this.getItem(position);
    CustomListItem customListItem_ = new CustomListItem(getContext());
    customListItem_.setListItemTitle(item.getTitle());
    customListItem_.setListItemDetails(item.getDescription());
    customListItem_.setListItemImage(item.getImage());

    layout.addView(customListItem_);

    horizontalScrollView.addView(layout);
    convertView = horizontalScrollView;
    return convertView;
}
这里是MainActivity中的onCreate

  @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    LinearLayout layout = new LinearLayout(getApplicationContext());
    ListView listView = new ListView(getApplicationContext());

    CustomListItem customListItem = new CustomListItem(getApplicationContext());

    List<ItemInfo> values = new ArrayList<ItemInfo>();
    Bitmap image = BitmapFactory.decodeResource(getResources(), R.mipmap.clear);
    ItemInfo info = new ItemInfo(image,"Hi","android");
    ItemInfo info2 = new ItemInfo(image,"Hi2","android");
    values.add(info);
    values.add(info2);

    Adapter_ = new ItemAdapter(this, values);

    setContentView(R.layout.activity_main);

    layout.addView(listView);
    setContentView(layout);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = new LinearLayout(getApplicationContext());
    layout.setOrientation(LinearLayout.VERTICAL);
    ListView listView = new ListView(this);

    listView.setPadding(0, (int)getResources().getDimension(R.dimen.list_item_top), 0, 0);

    listView.setDivider(null);

    List<ItemInfo> values = new ArrayList<ItemInfo>();
    Drawable image = getResources().getDrawable(R.mipmap.clear);

    for (int i = 0; i < 20; i++) {
        ItemInfo info = new ItemInfo(image, getResources().getString(R.string.title) + i, getResources().getString(R.string.details) + i);
        values.add(info);
    }

    Adapter_ = new ItemAdapter(this, values);
    listView.setAdapter(Adapter_);
    layout.addView(listView);
    setContentView(layout);
}

希望它将是有用的

thx,但它不起作用。其他人知道出了什么问题吗?我想问题出在适配器中的getView方法中,因为我没有更改convertView。但是如何将自定义视图添加到convertView中呢?