GeekedOut,
Существует ряд проблем с кодом, который вы указали выше. Конечно, в первую очередь (и я знаю, что вы исправили) это установка идентификатора на @android:id/list
. Но я видел, что никто не объяснил , почему так и должно быть. ListActivity
и TabActivity
требуют использования специальных идентификаторов при создании ListView
и TabHost
(и т. Д.), К которым они будут привязаны. Это не столько для самой деятельности, сколько для используемого адаптера. Если вы этого не сделаете, адаптеры могут сломаться (быстро).
Теперь что касается рендеринга. Есть две возможности: а) не получить данные; или б) он не понимает, как это сделать. Хотя а) может быть возможность, я не вижу в этом реальной проблемы, поскольку вы правильно делаете большинство вещей. По правде говоря, использование адаптера является наиболее вероятной проблемой. И вот почему:
super.onCreate(savedInstanceState);
adapter = new ArrayAdapter<SolutionTopic>(this, R.layout.solution, R.id.label, problems);
Нигде здесь вы на самом деле не говорите это setContentView()
. Вы можете установить его на View или Layout. Учитывая глубину вашего файла макета, вы должны установить его как макет с помощью:
super.onCreate(savedInstanceState);
setContentView(R.layout.solution);
//We'll stick the adjusted Adapter call here.
Теперь возникает реальная проблема: ArrayAdapter работает очень особым образом. Вы можете расширить его, но если вы этого не сделаете, вы застряли на его способ делать вещи. Вы используете вызов для создания адаптера:
new ArrayAdapter<Class>(context, rowItemLayout, textViewId, objects);
Ключом здесь является rowItemLayout
файл. Файл, который вы указали для США, является файлом макета вашей деятельности. Вам нужен отдельный файл XML Layout для ПРОСТО элемента списка, как вы хотите, чтобы он отображался. Там вы помещаете свой TextView
и даете ему идентификатор, отличный от идентификаторов в вашем файле Activity Layout. Прямо сейчас ваш адаптер теряет сознание, потому что вы ссылаетесь на файл макета с помощью ListView, который ссылается на файл макета с помощью ListView ... и все они имеют одинаковый идентификатор в одном и том же пространстве.
Пример макета rowItem будет:
list_item.xml
<TextView android:id="@+id/mylistitem"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
То, как вы будете его использовать, будет:
new ArrayAdapter<SolutionTopic>(this, R.layout.list_item, R.id.mylistitem, problems);
Теперь, это облегчает путаницу для вашего плохого компилятора. Если у вас по-прежнему возникают проблемы с рендерингом вашего ListView, вам, возможно, придется рассмотреть вопрос о расширении ArrayAdapter (многие это делают). Если вы расширяете ArrayAdapter, просто создайте новый класс, которому вы можете передать список. Затем переопределите метод getView()
. Вот пример:
@Override public View getView(final int position, View convertView,
final ViewGroup parent)
{ final SolutionTopic _app = problems.get(position);
TextView _text;
if (convertView == null) {
convertView = myInflater.inflate(R.layout.list_item, null);
_text = (TextView) convertView.findViewById(R.id.txtAppName);
convertView.setTag(_text);
}
else _text = (TextView) convertView.getTag();
_text.setText(problems.member);
return convertView;
}
Оттуда действительно не так уж плохо. Есть некоторые другие вещи, которые следует учитывать при расширении, но только если вы делаете более сложные вещи.
Наконец, один маленький кусочек дополнительной помощи. Вы должны создать TextView в вашем файле ActivityLayout с идентификатором android:id/empty
. Если в вашем списке нет данных, он будет отображать это поле. Это без сомнения скажет вам, рендерится или теряет данные.
Надеюсь, это поможет,
FuzzicalLogic