ArrayAdapter — Что я делаю не так?

#android

#Android

Вопрос:

У меня есть ListActivity, который я пытаюсь привязать к массиву бизнес-объектов с помощью пользовательского ArrayAdapter.

Когда я запускаю приложение либо на эмуляторе, либо на реальном устройстве Android, я получаю нулевую ссылку в ArrayAdapter в строке «holder.txtTeam1.setText(info.Team1);». После некоторой отладки похоже, что вызов для раздувания макета на самом деле не создавал дочерние текстовые представления, он создавал только внешний TableLayout.

Все это основано на руководстве, которое я нашел в Интернете, и я почти неделю бился головой об стол над этим. Кто-нибудь может сказать мне, что я делаю не так?

Действие выглядит так:

     public class BaseballPressActivity extends ListActivity {

    private GameDataAdapter adapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        adapter = new GameDataAdapter(this, new GameData[]{new GameData("3:10pm","Team 1","Team 2")});
        this.setListAdapter(adapter);
        }
    }
  

ArrayAdapter выглядит следующим образом:

 public class GameDataAdapter extends ArrayAdapter<GameData> {

Context context;
GameData data[] = null;

public GameDataAdapter(Context context, GameData[] data) {
    super(context,R.layout.listitem_game, R.id.Name1, data);

    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    GameViewHolder holder = null;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(R.layout.test , parent, false);

        holder = new GameViewHolder();
        holder.txtTeam1 = (TextView)row.findViewById(R.id.Name1);

        row.setTag(holder);
    }
    else
    {
        holder = (GameViewHolder)row.getTag();
    }

    GameData info = data[position];
    holder.txtTeam1.setText(info.Team1);

    return row;
}

static class GameViewHolder
{
    TextView txtTeam1;
    TextView txtTeam2;
    TextView txtGameTime;
}

}
  

И макет элемента действия списка выглядит следующим образом:

     <?xml version="1.0" encoding="utf-8"?>
<TableLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
    <TableRow android:id="@ id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content">
        <TextView android:text="TextView" android:layout_weight="0" android:id="@ id/textView1" android:layout_height="wrap_content" android:layout_width="0dp"></TextView>
        <ImageView android:id="@ id/imageView1" android:src="@drawable/icon" android:layout_height="wrap_content" android:layout_weight="0" android:layout_width="0dp"></ImageView>
        <LinearLayout android:id="@ id/linearLayout1" android:orientation="vertical" android:layout_height="wrap_content" android:layout_weight="1" android:layout_width="0dp">
            <TextView android:text="TextView" android:id="@ id/Name1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
            <TextView android:text="TextView" android:id="@ id/Name2" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
        </LinearLayout>
        <ImageView android:id="@ id/imageView2" android:src="@drawable/icon" android:layout_height="wrap_content" android:layout_weight="0" android:layout_width="0dp"></ImageView>
    </TableRow>
    </TableLayout>
  

Комментарии:

1. Яшвант Кумар получает похвалу за ответ, а Дэн С получает одобрение за то, что дал мне более простое решение и показал мне то, о чем я не знал. Спасибо вам всем.

Ответ №1:

хорошо, я думаю, проблема здесь

  row = inflater.inflate(R.layout.test , parent, false);
  

измените false на true, я думаю, вам нужно прикрепить представление к его родительскому элементу.

если это не сработает, попробуйте это.

  row = inflater.inflate(R.layout.test , null);
  

Ответ №2:

Отказаться от ArrayLayout для SimpleAdapter или SimpleCursorAdapter. Это позволит вам легко привязывать свои данные с помощью простых и довольно сложных макетов.

Комментарии:

1. Это то, что я пытался делать раньше, но, похоже, SimpleAdapter позволял мне привязывать только одно свойство бизнес-объекта к одному представлению в макете. Когда это будет полностью работать, мне действительно нужно будет привязать 5 представлений в LayoutItem к разным полям в бизнес-объекте. Я обновлю вопрос, чтобы отразить это.

2. Используя параметры from и to в конструкторах, вы можете привязать произвольное количество элементов данных к представлениям.