Android:适配器中的getView从未调用过

时间:2014-08-07 14:46:08

标签: android listview adapter getview

仍然关注适配器的工作原理和结构。我试图在xml中显示文本(来自服务器),用户应该能够编辑该文本然后将其发送回服务器。很少与AutoCompleteTextView和EditText混淆。这就像:服务器发送一顿饭(苹果,香蕉和芒果)。如果用户擦除芒果并开始编写 ba ,banana会出现AutoCompleteTextView。

但我的主要问题是从不调用getView。 我觉得它与我如何声明适配器有关:arrayAdapter与其他东西。

谢谢!

简单活动

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>

3 个答案:

答案 0 :(得分:3)

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

重写getCount()以返回数组中元素的数量,或者使用同时包含数组的ArrayAdapter构造函数的重载。

答案 1 :(得分:1)

您正在使用与实际构造函数不同的重载构造函数。那很好但是你需要覆盖getCount方法,因为它总是返回0。

以下是:

@Override
public int getCount() {
    return list.size();
}

编辑:

现在我注意到您使用的是自定义类Meal。你需要追踪它的数量。

如果它的唯一物品是芒果,苹果,香蕉,那么你可以简单地return 3;

<强> EDIT2:

问题是您的Meal类无法遍历对象,这证明了: foodItem1.setText(list.MealName);

您希望您的课程像list.get(0).MealName, list.get(1).MealName...

一样可循环播放

也许您想要的是一份膳食对象列表:List<Meal> meals = getMeals();

目前(即使您可以计算用餐次数),您的所有观看次数都与list.MealName相同,list.Meald也不会改变。希望这有点清除它。

答案 2 :(得分:0)

我们通常会填充数据,而不是将数据传递给customAdapter,例如跟随伪代码:

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

并在自定义适配器内部确保正确覆盖getCount()方法。

通常它实现如下:

    getCount(){
       data.size()
    }