2012-05-26 1 views
1

Недавно я начал создавать приложение для Android, для которого требуется список из 20 имен и счетчиков для каждого отдельного имени, отображаемых на экране. Каждый раз, когда кто-то забирает имя, счетчик для этого имени увеличивается на единицу. Это означает, что имя и счетчик должны быть «связаны» каким-то образом.Как отобразить массив String и массив Integer в одном ListView

Я начал с создания основного списка имен, используя ListView. Это мой код:

public class ExampleActivity extends ListActivity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     String[] NAMES = getResources().getStringArray(R.array.names_array); 
     setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, NAMES)); 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 

     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       if (position == 0) //Shows toast with name 
       Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

Вот файл list_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:textSize="16sp" > 
</TextView> 

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

Однако, поскольку я всего лишь новичок в Android, я не уверен, как это сделать. Моя первая проблема заключается в том, что я не знаю, как каким-то образом объединить мой список из 20 имен со списком из 20 целых чисел и сделать эти целые числа конкретными для каждого имени. Моя вторая проблема заключается в том, как отображать все это на экране.

+1

http://samir-mangroliya.blogspot.in/p/android-customized-listview.html –

+0

@SamirMangroliya Спасибо, я думаю, это поможет мне! –

ответ

1

Организуйте свои данные строки (имя + счетчик) в простом Model классе:

class Model { 
    String name; 
    int counter; 

    Model(String name, int counter) { 
     this.name = name; 
     this.counter = counter; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 
} 

Затем построить макет строки, чтобы показать имя и счетчик:

<?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" > 

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

    <TextView 
     android:id="@+id/counter" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" /> 

</RelativeLayout> 

Наконец связать данные Model к макету строк:

public class ModelAdapter extends ArrayAdapter<Model> { 

     private ArrayList<Model> data; 

     public ModelAdapter(Context context, int resource, 
       int textViewResourceId, ArrayList<Model> objects) { 
      super(context, resource, textViewResourceId, objects); 
      data = objects; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // let the adapter bind the name to the list 
      View v = super.getView(position, convertView, parent); 
      // find the counter TextView so we can update it's value 
      TextView counterTv = (TextView) v.findViewById(R.id.counter); 
      //get the data from the list for this row. 
      Model obj = data.get(position); 
      //set the counter value for this row 
      counterTv.setText(String.valueOf(obj.counter)); 
      return v; 
     }  

    } 

Чтобы использовать новый адаптер:

//... 
    String[] NAMES = getResources().getStringArray(R.array.names_array); 
    // construct the list of model object for your rows: 
    ArrayList<Model> items = new ArrayList<Model>(); 
    for (int i = 0; i < 20; i++) { 
     items.add(new Model(NAMES[i], 0));// I guess the counter starts at 0 
    } 
    mAdapter = new ModelAdapter(this, R.layout.list_item, R.id.name, items); 
    setListAdapter(); 
    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true);  

//... 

ListActivity уже имеет OnItemClickListener реализован, является onListItemClick метод:

public void onListItemClick(ListView parent, View view, int position, long id) { 
         Model clickedRowData = parent.getItemAtPosition(position); 
         clickedRowData.counter++; 
         // notify the adapter that something was updated 
         mAdapter.notifyDataSetChanged(); 
        } 
+0

Ничего себе, это отлично выглядит. Я попробую это как можно скорее, благодаря ЛЮБОЙ! –

+0

Я только что внедрил его, он отлично работает. Еще раз спасибо! –

1

Лучше всего настроить настраиваемый элемент списка с указанием имени и целого, как вы хотите. Затем в вашем слушателе onItemSelect просто увеличивайте это целое число и вызовите notifyDataSetChanged. сообщение в блоге, предоставленное Самиром, похоже, очень неплохо подходит для настройки ваших пользовательских элементов списка.

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