#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>
Вот как это должно выглядеть в эмуляторе:
Комментарии:
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, вам нужно сделать так:
- Создайте свой пользовательский 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" />
- Создайте пользовательский 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; } }
- Используйте этот пользовательский класс адаптера в своей основной деятельности для заполнения 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 . . .