Android - создание представления с помощью адаптера списка и дополнительных полей ничего не отображает - PullRequest
0 голосов
/ 17 марта 2012

Я играю с этим видом:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

<TextView
    android:id="@+id/solution_title"    
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Label1"
    />  

<TextView
    android:id="@+id/solution_description"    
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Label2"
    />  

    <ListView
        android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/label"
        android:textSize="20px" >
    </ListView>

</LinearLayout>

Я хочу использовать ListAdopter для отображения ListView и отображения списка элементов, а также использовать простые текстовые метки дляпервые два элемента.

Прямо сейчас я ничего не получаю, когда пытаюсь просто отобразить первые два текстовых поля:

public class SuggestedSolutionActivity extends ListActivity 
{
    ArrayAdapter<SolutionTopic> adapter;        

    ArrayList<SolutionTopic> problems = new ArrayList <SolutionTopic>( );   

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);        
        adapter = new ArrayAdapter<SolutionTopic>(this, R.layout.solution, R.id.label, problems);

        final TextView solution_title  = (TextView) findViewById(R.id.solution_title);        
        final TextView solution_description = (TextView) findViewById(R.id.solution_description);

}

Есть идеи, почему поля TextView не отображаются для меня?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 20 марта 2012

Попробуйте это:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load your layout
    setContentView(R.layout.your_layout);

    adapter = new ArrayAdapter<SolutionTopic>(this, R.layout.solution, R.id.label, problems);

    final TextView solution_title  = (TextView) findViewById(R.id.solution_title);        
    final TextView solution_description = (TextView) findViewById(R.id.solution_description);

     // Bind to our new adapter.
     setListAdapter(adapter);
}

В макете вы должны изменить идентификатор ListView:

<ListView
        android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/label"
        android:textSize="20px" >
</ListView>

Я почти уверен, что это сработает:)

PD: Почему вы используете final для полученных TextViews? Если вы не хотите изменять свойства или содержимое TextViews, вам даже не нужно получать их с помощью findViewByID, они будут просто отображаться с помощью setContentView (R.layout.your_layout). И если вы хотите изменить их (возможно, добавив прослушиватель), я думаю, вы не можете использовать «final», но я не совсем уверен в этом.

1 голос
/ 20 марта 2012
android:id="@+id/label"

измените это на

android:id="@android:id/list"

Когда вы настраиваете ListActivity, убедитесь, что вы всегда используете идентификатор списка просмотра как @android: id / list.

1 голос
/ 17 марта 2012

Почему бы вам не заменить последний TextView на ListView ?

0 голосов
/ 20 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...