仍然关注适配器的工作原理和结构。我试图在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>
答案 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()
}