android - 将三个 ArrayList 合二为一并在自定义 ListView 中查看

标签 android android-arrayadapter android-custom-view

我正在尝试发送这个 ArrayList :

all1 = all.toArray(new String[all.size()]);

这是从 JSON 解析的这三个数组列表的总和:

for (int j = 0; j < itemNames.size(); j++) {
                all.add(brandNames.get(j) + " " + itemNames.get(j) + " " + Carbs.get(j));
            }

到自定义 ListView ,但在设置适配器时遇到问题。

我有一个自定义 ListView ,如下所示(search_list_view):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/activity_horizontal_margin">

<!-- layout child -->
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <!-- Edit button -->
    <Button
        style="?android:attr/buttonStyleSmall"
        android:text="@string/add"
        android:id="@+id/btnAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true" />


</RelativeLayout>

<!-- Text view for main text -->
<TextView
    android:id="@+id/brandName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="Item Name"
    android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>

我知道我需要一个自定义适配器,到目前为止我有这个但它不工作:

private class FoodAdapter extends ArrayAdapter<Food> {


    public FoodAdapter(Context context, List<Food> objects) {
        super(context, 0, objects);
    }

    //inflate view layout_list_item
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = 
getLayoutInflater().inflate(R.layout.search_list_item, parent, false);
        }
        //link buttons to views within layout_list_item
        Button btnAdd = (Button) convertView.findViewById(R.id.btnAdd);
        TextView txtMemo = (TextView) 
convertView.findViewById(R.id.brandName);
return convertView;

我的模型如下:

public class Food implements Serializable {
//set variables
private Date date;
private String text;
private boolean fullDisplayed;
private static DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyy 'at' hh:mm aaa");
//memo date
public Food() {
    this.date = new Date();
}
//create Food
public Food(long time, String text) {
    this.date = new Date(time);
    this.text = text;
}
//get time
public long getTime() {
    return date.getTime();
}
//set text
public void setText(String text) {
    this.text = text;
}
//get text
public String getText() {
    return this.text;
}

//get shortened version of text for not full displayed
public String getShortText() {
    String temp = text.replaceAll("\n", " ");
    if (temp.length() > 25) {
        return temp.substring(0, 25) + "...";
    } else {
        return temp;
    }
}
//set full displayed
public void setFullDisplayed(boolean fullDisplayed) {
    this.fullDisplayed = fullDisplayed;
}
//set flag for if is full displayed
public boolean isFullDisplayed() {
    return this.fullDisplayed;
}
//set a toString method for returning text.
@Override
public String toString() {
    return this.text;
}
}

最佳答案

您还没有在 TextView 的 getView 中设置数据。您必须从列表中获取该位置的数据,并使用 Food 类的 getText 方法填充到 TextView 中。

将您的适配器代码替换为以下代码:

private class FoodAdapter extends ArrayAdapter<Food> {
    private List<Food> mObjects;

    public FoodAdapter(Context context, ArrayList<Food> objects) {
        super(context, 0, objects);
        mObjects = new ArrayList<Food> (objects);
    }

    //inflate view layout_list_item
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = 
getLayoutInflater().inflate(R.layout.search_list_item, parent, false);
        }
        //link buttons to views within layout_list_item
        Button btnAdd = (Button) convertView.findViewById(R.id.btnAdd);
        TextView txtMemo = (TextView) 
convertView.findViewById(R.id.brandName);
    txtMemo.setText(mObjects.get(position).getText());
return convertView;

注意- 在上面的代码中,我在创建列表时创建了一个 ArrayList。 List 是一个接口(interface),当你创建一个实例时,你必须用一个类来创建它,比如 ArrayList 或 LinkedList。因此,当您调用适配器时,传递的是 ArrayList 而不是 List。

关于android - 将三个 ArrayList 合二为一并在自定义 ListView 中查看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43428329/

相关文章:

java - getView() 从未在自定义适配器上调用过

Android - CircleView 内的 Google map

android - 如何在增加 Android 目标 SDK 时识别潜在的不兼容

android - 如何像在 Google Keep 中那样添加复选框 ListView?

android将日期字符串转换为以毫秒为单位的时间

安卓。找不到 KeyFactory RSA 实现

java - 如何在 ArrayAdapter 中使用带有 4 个不同单选按钮的 Radiogroup

java - 在 RecyclerView/ListView 中创建没有数据的 View

java - 自定义线性布局在添加 View 时有问题

java - 如何从自定义View(Java类)正确启动Activity?