2013-05-28 3 views
2

Я хочу заполнить ListViewLinkedList<String> моих собственных элементов.Могу ли я заполнить список со списком своего собственного класса?

Мой класс выглядит следующим образом:

public class Foo { 
    public String text; 
} 

это мой адаптер и список:

String[] fromColumns = {"X"}; 
int[] toViews = {android.R.id.text1}; 
mAdapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_1, null, 
     fromColumns, toViews, 0); 
list = (ListView)findViewById(R.id.list); 
list.setAdapter(mAdapter); 

и у меня также есть LinkedList<Foo> elements;, который я хочу, чтобы отобразить в моем списке

Теперь вопрос: как это решить?

  1. Я не знаю, что писать в fromColumns, чтобы соответствовать моим text значение,
  2. Я не знаю, как связать мой elements список в список, так что будет отображаться

ответ

1

Создайте пользовательский адаптер. Вы можете продлить BaseAdapter или ArrayAdapter. ArrayAdapter - общий класс, поэтому он хорошо подходит для этого примера.

Возможная реализация:

public class CustomAdapter extends ArrayAdapter<Item> { 

    public CustomAdapter(Context context, List<Item> items) { 
     super(context, 0, items); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = View.inflate(getContext(), R.layout.some_layout, null); 
      holder = new ViewHolder(); 
      holder.textView = (TextView) convertView.findViewById(R.id.textView); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.textView.setText(getItem(position).getText()); 
     return convertView; 
    } 

    private class ViewHolder { 
     TextView textView; 
    } 
} 

Теперь установите адаптер, как это:

CustomAdapter customAdapter = new CustomAdapter(context, getList()); 
listView.setAdapter(customAdapter); 
+0

Я редактировал свой ответ. В ArrayAdapter уже есть список и контекст, поэтому вы можете (и должны) использовать их. Кроме того, если вы используете пользовательский список в своем адаптере вместо использования ArrayAdapter one, реализация 'add' по умолчанию не будет работать. Кроме того, я использовал 'View.inflate', поэтому вам не нужно запускать LayoutInflater, а код яснее – razielsarafan

+0

@ santirivera92 О, вы правы. Просто скопируйте код из старого проекта без особого внимания. Благодарю. – Ahmad

+0

отлично работает! – gurehbgui

0

Вам нужно создать Пользовательский адаптер для этого ..

как:

public class AdapterCategoryList extends BaseAdapter { 
    private Context context; 
    private ArrayList<SetterCategoryNames> categoryNames; 
    public AdapterCategoryList(Context context, ArrayList<SetterCategoryNames> categoryNames){ 
     this.context = context; 
     this.categoryNames = categoryNames; 
    } 

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

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Holder holder; 
     if (convertView == null) { 
      convertView = View.inflate(context, R.layout.listitem_category_list, null); 
      holder = new Holder(); 
      holder.mTxtCategoryImage = (TextView) convertView.findViewById(R.id.txtCategoryListItem); 
      convertView.setTag(holder); 
     }else{ 
      holder = (Holder) convertView.getTag(); 
     }   
     holder.mTxtCategoryImage.setBackgroundResource(categoryNames.get(position).getCategoryImage());   
     return convertView; 
    } 

    class Holder { 
     TextView mTxtCategoryImage; 
    } 

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