Android, проблемы с пользовательским listview

#android

#Android

Вопрос:

Я использую пользовательский listview, который я нашел здесь:

http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_9.html

Кажется, он действителен в Eclipse и хорошо выглядит на вкладке предварительного просмотра. Это просто listview, у которого есть кнопка внизу. Итак, я добавил его как R.layout.buttonlist

     <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:id="@ id/testbutton"
        android:text="@string/hello" android:layout_alignParentBottom="true" />

    <ListView android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:id="@ id/list"
        android:layout_alignParentTop="true" android:layout_above="@id/testbutton" />

</RelativeLayout>
 

К сожалению, когда я запускаю его, я получаю всплывающее окно, в котором говорится, что Android неожиданно закрылся:

  setListAdapter(new ArrayAdapter<String>(this, R.layout.buttonlist , data));
 

Когда я пытаюсь использовать встроенное представление списка:

  setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));
 

все работает нормально. Я не вижу никаких ошибок или предупреждений в logcat, поэтому я не уверен, как точно определить проблему. У кого-нибудь есть какие-либо идеи? Спасибо

Редактировать: добавление активности

 public class TestActivity extends ListActivity {

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


        List<String> data = new ArrayList<String>();
       data.add("hello");
       data.add("world");
        setContentView(R.layout.buttonlist);
        //setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));
    }
}
 

Ответ №1:

Хуфамон, я хотел бы исправить вас здесь. Вы создаете не пользовательский ListView, а пользовательский макет с ListView. Кроме того, я считаю, что вы не совсем поняли, что здесь делает setListAdapter.

Эта строка, которая у вас есть, указывает listview использовать ‘android.R.layout.simple_list_item_1‘ в качестве содержимого своего макета. Этот макет предварительно определен в Android SDK. Он будет просто содержать текст в каждом элементе listview. Третий атрибут ‘data‘ указывает содержимое каждого элемента listview.

 setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));
 

Итак, как предположил Майк Л., если ваше намерение состоит в том, чтобы иметь listview только с текстом (имеющим формат по умолчанию), то строка выше хорошо послужит этой цели. Вы можете установить «R.layout.buttonlist» в качестве макета вашего действия, используя

 setContentView(R.layout.buttonlist);
 

Однако, если вы планируете включить дополнительный контент в listview (чтение изображений) или хотите изменить стиль текста, вам придется определить пользовательский макет для listview. Мы можем направить вас к соответствующим источникам, если вы хотите знать, как это можно сделать.

РЕДАКТИРОВАТЬ: возможный способ загрузки данных в обычный ListView

TestActivity.java

 public class TestActivity extends Activity {
/** Called when the activity is first created. */
@Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.buttonlist);

      List<String> data = new ArrayList<String>();
      data.add("hello");
      data.add("world");


      ListView mListView = (ListView)findViewById(R.id.list);

      mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , data));

   }
}
 

buttonlist.xml

 <?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" 
android:layout_height="fill_parent">

   <Button 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:id="@ id/testbutton"
    android:text="@string/hello" 
    android:layout_alignParentBottom="true" />

   <ListView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:id="@ id/list"
    android:layout_alignParentTop="true" 
    android:layout_above="@ id/testbutton" />

</RelativeLayout>
 

Вот как это должно выглядеть в эмуляторе: ListView

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

1. Спасибо за ответ, к сожалению, когда я пытаюсь setContentView(R.layout.buttonlist); как вы предлагаете, я все еще получаю ту же ошибку. Я отредактировал свой оригинальный пост, чтобы включить в него полезную активность. Даже если предложенный вами метод работает, мне остается только гадать, как я могу добавить к нему данные?

2. Пожалуйста, посмотрите на редактирование! Если нет конкретной причины, по которой вы расширяете ListActivity, я рекомендую расширить действие, поскольку различия между ними незначительны

Ответ №2:

Я не думаю, что у вас может быть listview в макете адаптера. Переданный макет должен просто описывать строку в listview. Таким образом, buttonlist должен просто содержать xml для кнопки. Listview должен быть в отдельном файле макета. Если это действие списка, вам не нужен другой файл макета, просто вызовите setListAdapter, как вы делаете.

Ответ №3:

Если вы хотите использовать свой R.layout.buttonlist для заполнения вашего listview, вы можете сделать это следующим образом (ваша TestActivity должна расширять Activity, а не ListActivity):

 public void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);
    setContentView(R.layout.buttonlist);

    String data[]=new String[]{"Item_1","Item_2","Item_3"}
    Button b=(Button)findViewById(R.id.testbutton);
    ListView lv=(ListView)findViewById(R.id.list);

    ArrayAdapter aa=new ArrayAdapter(context,android.R.layout.simple_list_item_1, data);
    lv.setAdapter(aa);

    //Your code...
}
 

Теперь, если вы хотите создать пользовательский listitem для отображения в listview, вам нужно сделать так:

  1. Создайте свой пользовательский XML-файл listitem.

    Пример: custom_listitem.xml

     <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@ id/icon"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:id="@ id/text"
        />
     
  2. Создайте пользовательский ArrayAdapter:

    Пример. CustomArrayAdapter.class

     public class CustomArrayAdapter extends ArrayAdapter<String> {
    
    String[] array;
    LayoutInflater mInflater;
    
    public CustomArrayAdapter(Context context, int textViewResourceId,
            String[] objects)
    {
        super(context, textViewResourceId, objects);
        array=objects;
        mInflater = LayoutInflater.from(context);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {       
        final ViewHolder holder;
    
        if(convertView==null)
        {
                 convertView = mInflater.inflate(R.layout.custom_listitem, null);
                 holder = new ViewHolder();
    
                 holder.text=(TextView)convertView.findViewById(R.id.text);
                 holder.img=(ImageView)convertView.findViewById(R.id.icon);
                 convertView.setTag(holder);
        }
        else
                holder=(ViewHolder)convertView.getTag();
    
        holder.text.setText(array[position]);
    
        if(position==0)
            holder.img.setImageResource(R.drawable.img1);
        else if(position==1)
            holder.img.setImageResource(R.drawable.img2);
        else if(position==2)
            holder.img.setImageResource(R.drawable.img3);
    
        return convertView;
    }
    
    static class ViewHolder
    {
        TextView text;
        ImageView img;
    }
    }
     
  3. Используйте этот пользовательский класс адаптера в своей основной деятельности для заполнения listview:

    Убедитесь, что это основное действие расширяет Activity, а не ListActivity

     super.onCreate(savedInstanceState);
    
    setContentView(R.layout.main);
    context=getApplicationContext();
    lv=(ListView)findViewById(R.id.listview);
    
    CustomArrayAdapter aa=new CustomArrayAdapter(context,R.layout.custom_listitem, new String[]{"item_1","item_2","item_3"});
    
    lv.setAdapter(aa);
    
               // other lines of code
               .
               . 
               .