2013-06-06 4 views
3

Извините, если это немного нубийский вопрос. Я привык писать приложения Windows 8 в JS и CSS, и я все еще не очень хорошо разбираюсь в java.Как стилизовать отдельные элементы списка в Android?

Я в процессе создания своего первого приложения для Android (заметок). У меня есть стандартный ListView, определенный в моем XML, как это:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
    > 

<ListView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/notesListView" 
     android:fastScrollEnabled="true" 
     android:dividerHeight="2dp" 
     android:layout_alignParentStart="true" 
     android:divider="#b5b5ae" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 

     /> 


</RelativeLayout> 

У меня есть примечание берущего приложение работает, но в данный момент пользовательский интерфейс с ** т.

Я пытаюсь применить стили к каждому отдельному элементу списка, но я не могу найти руководство noobs для этого.

Я хочу, чтобы каждое новое примечание, которое добавлено в список, автоматически получает предопределенный стиль (например, поля).

Может кто-нибудь скажет мне лучший способ применения стилей к каждому отдельному элементу списка из XML (например, задание полей и т. Д.).

А также кто-нибудь знает, как динамически изменять отдельные элементы списка (например, я хочу, чтобы это можно было сделать, если пользователь выбирает определенный цвет из диалога, этот индивидуальный элемент списка меняет цвет BG).

EDIT 1:

Привет, Вот код для моего listNotes активности:

package com.fishingfon.notetakerui; 


public class ListNotesActivity extends Activity { 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
    notes.remove(info.position); 
    populateList(); 
    //populateLateCustomAdapter(); 

    return true; 
} 


@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu, menu); 
} 




@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_CANCELED){ 
     return; 
    } 
    Serializable extra = data.getSerializableExtra("Note"); 
    if (extra != null){ 

     Note newNote = (Note)extra; 
     if (editingNoteId > -1){ 

      notes.set(editingNoteId, newNote); 
      editingNoteId = -1; 
     } 
     else { 

      notes.add(newNote); 
     }; 
     populateList(); 
     //populateLateCustomAdapter(); 

    } 

} 



private List<Note> notes = new ArrayList<Note>(); 
private ListView notesListView; 
private int editingNoteId = -1; 

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list_notes); 
    ListView notesListView = (ListView)findViewById(R.id.notesListView); 

    notesListView.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapter, View view, int itemNumber, long id) { 

      Intent editNoteIntent = new Intent(view.getContext(), EditNotesActivity.class); 
      editNoteIntent.putExtra("Note", notes.get(itemNumber)); 
      editingNoteId = itemNumber; 
      startActivityForResult(editNoteIntent, 1); 


     } 
    }); 

    registerForContextMenu(notesListView); 

    notes.add(new Note("1 Note", "blah blah", new Date())); 
    notes.add(new Note("2 Note", "blah blah", new Date())); 
    notes.add(new Note("3 Note", "blah blah", new Date())); 
    notes.add(new Note("4 Note", "blah blah", new Date())); 
    notes.add(new Note("5 Note", "blah blah", new Date())); 
    notes.add(new Note("6 Note", "blah blah", new Date())); 
    notes.add(new Note("7 Note", "blah blah", new Date())); 
    notes.add(new Note("8 Note", "blah blah", new Date())); 

    populateList(); 
    //populateLateCustomAdapter(); 



} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.list_notes, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    //notes.add(new Note("Added note", "blah", new Date())); 
    //populateList(); 

    Intent editNoteIntent = new Intent (this, EditNotesActivity.class); 
    startActivityForResult(editNoteIntent, 1); 


    return true; 


} 




     // Populate Method 
     private void populateList() { 
      List<String> values = new ArrayList<String>(); 

      for(Note note : notes) { 

       values.add(note.getTitle()); 
      } 

      CustomListAdapter CustomAdapter = new CustomListAdapter(); 

      notesListView.setAdapter(CustomAdapter); 
     } 

А вот apadter класса вы мне дали, но с моими переменными именами и т.д.:

class CustomListAdapter extends BaseAdapter { 

Context mContext; 
List<String> mList; 

public CustomListAdapter (Context context, List<String> values) { 
    mList = values; 
    mContext = context; 
} 

@Override 
public int getCount() { 
    return mList.size(); 
} 

@Override 
public String getItem(int position) { 
    return mList.get(position); 
} 

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

// This method is called to draw each row of the list 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    // here you inflate the layout you want for the row 
    final View view = View.inflate(mContext, R.layout.item_list, null); 
    return view; 


}} 

Моя проблема заключается в методе populateList. Я сделал выделенную строку выше. Я не уверен, какой код и параметры добавить в мой метод populateList для создания нового адаптера.

Мне просто интересно, знаете ли вы, какой код я бы использовал для: CustomListAdapter CustomAdapter = новый CustomListAdapter();

и какие параметры необходимо передать ?.

Благодаря куч

Заранее спасибо

Приветствия Corey B

ответ

1

В адаптере вам нужно связать свой item_list ресурс со списком заметок, как это:

class CustomListAdapter extends BaseAdapter { 

    Context mContext; 
    List<String> mList; 

    public CustomListAdapter (Context context, List<String> list) { 
     mList = list; 
     mContext = context; 
    } 

    @Override 
    public int getCount() { 
     return mList.size(); 
    } 

    @Override 
    public String getItem(int position) { 
     return mList.get(position); 
    } 

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

    // This method is called to draw each row of the list 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     // here you inflate the layout you want for the row 
     final View view = View.inflate(mContext, R.layout.item_list, null); 

     // you bind the layout with the content of your list 
     // for each element of your list of notes, the adapter will create a row and affect the right title 
     final TextView noteTitle= (TextView)view.findViewById(R.id.note_title); 
     noteTitle.setText(mList.getItem(position)); 


     return view; 
    } 
} 
} 

Вот файл item_list.xml:

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

    <TextView 
      android:id="@+id/note_title" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 

</LinearLayout> 

А затем создать адаптер, писать в методе заселить:

// Populate Method 
    private void populateList() { 
     List<String> values = new ArrayList<String>(); 

     for(Note note : notes) { 

      values.add(note.getTitle()); 
     } 

     CustomListAdapter CustomAdapter = new CustomListAdapter(this, values); 

     notesListView.setAdapter(CustomAdapter); 
    } 
+0

Привета, Это кажется идеальным спасибо. У меня только один вопрос. Какой синтаксис я использую для установки этого адаптера ?.на предыдущем адаптере, который я использовал, я использовал это: «ArrayAdapter adapter = new ArrayAdapter (это android.R.layout.simple_list_item_1, android.R.id.text1, values);". но это не работает для адаптера, который вы дали. Знаете ли вы, что я буду использовать для установки адаптера ?. Еще раз спасибо. Corey " – Fishingfon

+0

Вы сделали привязку своего пользовательского макета к списку? Я обновил свой пост. – Esteam

+0

В методе getView вы должны проверить, равен ли параметр convertView нулевым. Если это так, вы должны раздуть новый макет. Если это не так, повторите использование одного и того же. Это более экономично с системными ресурсами и делает более оптимизированный список. – Kuffs

Смежные вопросы