Android:adapter中的getView方法从未被调用

3

我还在努力理解适配器的工作原理和结构。我试图在 XML 中显示来自服务器的文本,用户应该能够编辑该文本并将其发送回服务器。AutoCompleteTextView 和 EditText 有点令人困惑。它的工作方式是这样的:服务器发送一份餐单(苹果、香蕉和芒果)。如果用户删除了芒果并开始写ba,则 AutoCompleteTextView 将出现香蕉。

但我的主要问题是 getView 没有被调用。我有一种感觉这与我如何声明适配器有关:arrayAdapter vs 其他一些东西。

谢谢!

简单的活动

public class EditMealActivity extends ActionBarActivity {

    private Meal mealList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_meal);

        // getMealById returns: mango, apple, banana
        mealList = EditMealAdapter.getMealById();

        ArrayAdapter adapter = new EditMealAdapter(this, R.layout.activity_edit_meal, mealList);
        AutoCompleteTextView actv = (AutoCompleteTextView)findViewById(R.id.item1);
        actv.setAdapter(adapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.edit_meal, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}

连接服务器的适配器

public class EditMealAdapter extends ArrayAdapter<Meal> {

    private Meal list = null;
    private static LayoutInflater inflater=null;

    public EditMealAdapter(Context context, int layoutResourceID,
                           Meal _list){

        super(context, layoutResourceID);
        this.list = _list;
    }

    public static Meal getMealById(){
        Meal mealList;
        MealService mealService = MealServiceFactory.getMealService();
        mealList = mealService.getMealByName();
        return mealList;
    }

    // GETVIEW IS NEVER CALLED??????? ************************
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View r = convertView;
        if(convertView == null)
        {
            inflater = LayoutInflater.from(getContext());
            r = inflater.inflate(R.layout.activity_edit_meal, null);
        }

    // Should this maybe be: AutoCompleteTextView. User is to be able to write ap and apple comes up
        EditText foodItem1 = (EditText) r.findViewById(R.id.item1);
        EditText gram1 = (EditText) r.findViewById(R.id.grams1);

        foodItem1.setText(list.MealName);
        gram1.setText(list.Meald);

        return r;
    }
}

这里是EditText的xml代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/checkin"
    android:orientation="vertical"
    android:weightSum="1">

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="Meal"
            android:id="@+id/mealText"
            android:textSize="20dp"
            android:textColor="#ff65706a"
            android:layout_marginTop="30dp"
            android:layout_gravity="center_vertical|left"
            android:layout_marginLeft="30dp" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="Grams"
            android:id="@+id/gramsText"
            android:textSize="20dp"
            android:textColor="#ff65706a"
            android:layout_marginTop="30dp"
            android:layout_gravity="center_vertical|left"
            android:layout_marginLeft="200dp" />
    </RelativeLayout>


    <!-- The xml function -->
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <AutoCompleteTextView
            android:layout_width="140dp"
            android:layout_height="wrap_content"
            android:id="@+id/item1"
            android:inputType="textAutoComplete"
            android:imeOptions="actionNext"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="30dp" >
            <requestFocus/>
        </AutoCompleteTextView>

        <EditText
            android:layout_width="70dp"
            android:layout_height="wrap_content"
            android:id="@+id/grams1"
            android:imeOptions="actionNext"
            android:inputType="number"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="200dp" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:minHeight="0dp"
            android:minWidth="0dp"
            android:clickable="true"
            android:text="\?"
            android:id="@+id/nutritionButton"
            android:layout_alignBottom="@+id/grams1"
            android:layout_toRightOf="@+id/grams1" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="bottom">

        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Check in"
               android:id="@+id/checkInButton"
            android:layout_gravity="center_horizontal|bottom"/>

    </RelativeLayout>
</LinearLayout>

你的getCount方法返回值是否大于0? - MLProgrammer-CiM
3个回答

3

你没有将数组传递给super构造函数,因此ArrayAdapter无法在其getCount()实现中报告正确的项目数。

要么覆盖getCount()以返回数组中元素的数量,要么使用一个重载的ArrayAdapter构造函数,该构造函数还接受数组作为参数。


这是一个很好的观点!但是当我返回list.size时,我得到了“无法解析方法size()”的错误。 - Sindri Þór
你那里只有一个 Meal 对象而不是数组,所以一开始返回 1 是可行的。 - laalto
是的,我认为你说得对。但是 getCount 或者 getView 还没有被调用。有什么想法吗? - Sindri Þór
我已经找到了如何查找大小的方法。而你无法知道它。在餐点中,有一个名为“Ingredients”的项目。我必须找到它的大小。所以它是list.Ingredients.size(); 但它从未被调用,这一点我还不太理解。 - Sindri Þór

1
你正在使用一个不同于实际构造函数的重载构造函数。这没问题,但是你需要覆盖getCount方法,因为目前它总是返回0。
以下是如何操作:
@Override
public int getCount() {
    return list.size();
}

编辑:

我注意到你正在使用自定义类Meal,你需要跟踪它的数量。

如果它只有芒果、苹果和香蕉这些物品,那么你可以简单地return 3;

编辑2:

问题在于你的Meal类无法循环遍历对象,这证明了这一点:foodItem1.setText(list.MealName);

你希望你的类像list.get(0).MealName,list.get(1).MealName...一样可循环遍历。

也许你想要的是一个Meal对象列表:List<Meal> meals = getMeals();

目前(即使你能得到餐点数量),所有的视图都将与list.MealName相同,而list.Meald不会改变。希望这样有点澄清。


我明白了,但目前我只使用模拟数据库。我根本不知道未来会有多少项。所以我想我需要修复我的构造函数。我尝试在构造函数中将_list添加到super(...)中,但是然后我得到了“无法解析......”的错误。你有什么想法吗? - Sindri Þór
你误解了适配器的工作原理。它们接收一堆项目并使用它们创建视图,然后在ListView或其他地方显示这些视图。在适配器能够返回任何内容之前,你必须先有这些项目 - Simas
也许我没有理解所有的工作原理,但是我认为你是错的,不是有意冒犯。在activity中:mealList有3个可变餐点,而不是数组或列表。所以我无法取出list.size(我应该将其重命名为其他名称)。也许这是因为适配器是ArrayAdapter。但是回答你的非问题:我确实向适配器发送数据,它是一个餐点,而不是List或ArrayList。 - Sindri Þór
@SindriÞór 更新了,希望你能理解 :-) - Simas
我已经找到了如何查找大小的方法。而你无法知道它。在餐点中,有一个名为“Ingredients”的项目。我必须找到它的大小。所以它是list.Ingredients.size(); 但它从未被调用,这一点我还不太理解。 - Sindri Þór

0

通常我们会填充数据,然后将该数据传递给自定义适配器,类似以下伪代码:

data=getData();
CustomAdapter adapter=new CustomAdapter(context,data);

在自定义适配器中,请确保正确地重写了getCount()方法。

通常情况下,它的实现如下:

    getCount(){
       data.size()
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接