2011-01-29 3 views
5

я хотел бы иметь две линии в каждом ListView item.this мой код, но он не работает ...2 строки в элементе ListView

RE-EDITED КОД

public class nea extends ListActivity{ 
    private List<Message> messages; 





    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main2); 
     loadFeed(ParserType.DOM); 




    } 


    private void loadFeed(ParserType type){ 
     try{ 
      Log.i("News", "ParserType="+type.name()); 
      FeedParser parser = FeedParserFactory.getParser(type); 
      long start = System.currentTimeMillis(); 
      messages = parser.parse(); 
      long duration = System.currentTimeMillis() - start; 
      Log.i("News", "Parser duration=" + duration); 
      String xml = writeXml(); 
      Log.i("News", xml); 
      List<String> titles = new ArrayList<String>(messages.size()); 
      for (Message msg : messages){ 




       String o = titles.get(messages.size()); 
       if (o != null) { 
        TextView tt = (TextView) findViewById(R.id.TextView01); 
        TextView bt = (TextView) findViewById(R.id.TextView02); 
        if (tt != null) { 
         titles.add(""+msg.getDate());       } 
        if(bt != null){ 
         titles.add("date: "+ msg.getTitle()); 
        }return; 
      //titles.add(msg.getDate()+"\n"+msg.getTitle()); 
       } 
      // titles.add(msg.getTitle()+" "+msg.getDate()); 

      } 
      ArrayAdapter<String> adapter = 
       new ArrayAdapter<String>(this, R.layout.row,titles); 
      this.setListAdapter(adapter); 
     // textView.setText(Html.fromHtml(titles.get(position))); 




     } catch (Throwable t){ 
      Log.e("News",t.getMessage(),t); 
     } 
    } 

ВТОРОЙ ПУТЬ -не работают слишком

List<String> titles = new ArrayList<String>(messages.size()); 
       for (Message msg : messages){  

         String o = titles.get(messages.size()); 
        if (o != null) { 
         TextView tt = (TextView) findViewById(R.id.TextView01); 
         TextView bt = (TextView) findViewById(R.id.TextView02); 
         if (tt != null) { 
          titles.add(""+msg.getDate());       } 
         if(bt != null){ 
          titles.add("date: "+ msg.getTitle()); 
         }return; 
       //titles.add(msg.getDate()+"\n"+msg.getTitle()); 
        } 
       // titles.add(msg.getTitle()+" "+msg.getDate()); 

       } 
       ArrayAdapter<String> adapter = 
        new ArrayAdapter<String>(this, R.layout.row,titles); 
       this.setListAdapter(adapter); 
      // textView.setText(Html.fromHtml(titles.get(position))); 

      } catch (Throwable t){ 


Log.e("News",t.getMessage(),t); 
     } 
+1

Вы должны будете размещать весь код для этого, его не ясно, что вы там делаете. Что такое сообщения? Как настроить источник данных, адаптер и представление списка? – Jems

+0

Хорошо, я отправил еще код sir –

ответ

0

линии:

TextView tt = (TextView) findViewById(R.id.TextView01); 
TextView bt = (TextView) findViewById(R.id.TextView02); 

бессмысленны, потому что в этот момент нет списка элементов списка для msg, и вы не находите текстовые представления по ID в представлении элемента списка, а скорее в главном представлении.

Когда ваше приложение сначала начинается, у вас есть пустой ListView. Затем вы разбираете сообщения как часть onCreate (что, кстати, не очень хорошая идея, потому что отнимающие много времени процессы не должны выполняться в потоке пользовательского интерфейса), а затем приступить к попытке найти несуществующие текстовые представления по идентификаторам R.id.TextView01 и R.id.TextView02 на главном экране.

Имейте в виду, что вам понадобятся два XML-файла макета: один для макета активности списка и другой для макета каждого элемента списка. Также имейте в виду, что findViewById запросов для просмотра в пределах другой вид. В этом случае он пытается запросить основной вид, но у него нет текстовых просмотров TextView01 и TextView02; текстовые виды TextView01 и TextView02 - элементы элементов списка, полученные путем раздувания макета списка.

Я настоятельно рекомендую сначала начать с одной из демонстраций API, чтобы вы могли увидеть полный рабочий пример того, что было похоже на то, что вы пытаетесь выполнить. Например, http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

+0

Я действительно благодарен за ваш ответ, но я немного смутился ... –

+1

@kostas: Я думаю, что вы должны прочитать несколько руководств по 'ListView'. Я нашел тот, который выглядит очень хорошо: [http://www.androidpeople.com/android-custom-listview-tutorial-example/](http://www.androidpeople.com/android-custom-listview-tutorial-example /). Попробуйте прочитать это. –

2

Я просто использую раздувание Twoline listitem xml layout. В следующем примере text1 является заголовком, а text2 - субтитром.

public class CustomListAdapter extends BaseAdapter { 

    private String[] stringArray; 
    private Context mContext; 
    private LayoutInflater inflator; 
    int checkbox; 
    /** 
    * 
    * @param context 
    * @param stringArray 
    */ 
    public CustomListAdapter(Context context, String[] stringArray) 
    { 
     this.mContext=context; 
     this.stringArray=stringArray; 
     this.inflator= (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 

    @Override 
    public int getCount() 
    { 
     return stringArray.length; 
    } 

    @Override 
    public Object getItem(int position) 
    { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) 
    { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 

     final MainListHolder mHolder; 
     View v = convertView; 
     if (convertView == null) 
     { 
      mHolder = new MainListHolder(); 
      v = inflator.inflate(android.R.layout.two_line_list_item, null); 
      mHolder.txt1= (TextView) v.findViewById(android.R.id.text1); 
      mHolder.txt2= (TextView) v.findViewById(android.R.id.text2); 
      v.setTag(mHolder); 
     } 
     else 
     { 
      mHolder = (MainListHolder) v.getTag(); 
     } 
     mHolder.txt1.setText(stringArray[position]); 
     mHolder.txt2.setText(stringArray[position]); 

     /*mHolder.txt.setTextSize(12); 
     mHolder.txt.setTextColor(Color.YELLOW); 
     mHolder.txt.setPadding(5, 5, 5, 5);*/ 
     //mHolder.image.setImageResource(R.drawable.icon); 


     return v; 
    } 
    class MainListHolder 
    { 
     private TextView txt1; 
     private TextView txt2; 

    } 



} 

А также есть Example на Twoline ListItem

18

Для того, чтобы создать ListView с две строки текста по каждому пункту, я использую SimpleAdapter следующим образом:

Создать List, который будет хранить ваши данные. Каждая запись карты будет иметь ключ (первая строка) и значение (вторая строка) каждого из элементов ListView.

List<Map<String, String>> data = new ArrayList<Map<String, String>>(); 

Для каждой пары мы хотим поместить в ListView, создать HashMap и добавить его в список объявленного ранее.

Map<String, String> datum = new HashMap<String, String>(2); 
       datum.put("First Line", "First line of text"); 
       datum.put("Second Line","Second line of text"); 
       data.add(datum); 

Затем объявите SimpleAdapter. Обратите внимание на использование строк «Первая строка» и «Вторая строка» внутри конструктора. Это скажет адаптеру, как использовать строки объявленного ранее Map. Также обратите внимание на использование макета android.R.layout.simple_list_item_2 и текста id android.R.id.text1 и android.R.id.text2.

SimpleAdapter adapter = new SimpleAdapter(this, data, 
        android.R.layout.simple_list_item_2, 
        new String[] {"First Line", "Second Line" }, 
        new int[] {android.R.id.text1, android.R.id.text2 }); 
+1

Должны ли мы создать simple_list_item_2.xml или его уже определенные? Если мы сможем поделиться этим кодом? Я нашел некоторый макет xml, но theyre не работает ... – albatross

+1

@albatross, если вы хотите изменить и использовать файл simple_list_item_2.xml, затем перейдите по этой ссылке ... [link] (https://github.com/android/platform_frameworks_base/tree/master/core/res/res/layout) – Ruchir

+1

Это простое решение, которое работает сразу! – coolcool1994

0

Если вам не все равно о макете и прочее, и просто нужно несколько строк в списке. Самый простой способ сделать это, как это с возвратом каретки «\ п»

xList = FindViewById<ListView>(Resource.Id.xlist); 
mItems = new List<string>(); 
ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, mItems); 

xList.Adapter = adapter; 
adapter.Add("FirstLine\nSecondLine\nThirdLine\nEtc"); 
Смежные вопросы