Android ListActivity с ArrayList of Objects в качестве ресурса макета - PullRequest
0 голосов
/ 25 ноября 2010

Мне нужно отобразить список категорий из ListActivity. Мой источник данных - ArrayList типа Category, который реализует интерфейс Android Parcelable. структура дана внизу. у него есть идентификатор и заголовок

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

Можно создать новый массив заголовков, повторяя категорию ArrayList и используя this.setListAdapter(new ArrayAdapter<String>(this, R.layout.rowlayout, R.id.label, names));

Но, используя этот метод, я получу только название категории при клике, а не идентификатор.

Можно ли напрямую использовать ArrayList объектов в качестве источника данных?

public class CategoryList extends ListActivity  {
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        Intent t = new Intent(this, ParsingWebXML.class);
        startActivityForResult(t,1);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == 1 && resultCode == RESULT_CANCELED){
            finish();
        } else {
            createCategoryList(data);
        }
    }

    private void createCategoryList(Intent data) {
        ArrayList<Category> categories = null;
        try {
            categories = data.getParcelableArrayListExtra("categoryList");
            Iterator<Category> itr = categories.iterator();

            String[] names = new String[categories.size()];
            int i=0;
            while (itr.hasNext()) {
                Category c = itr.next();
                names[i++] = c.getTitle();
            }
            this.setListAdapter(new ArrayAdapter<Category>(this, R.layout.rowlayout, R.id.label, categories));
            // String[] names = new String[] { "Sports", "Mediacal", "Computers" };
            // this.setListAdapter(new ArrayAdapter<String>(this, R.layout.rowlayout, R.id.label, names));
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        // Get the item that was clicked
        Object o = this.getListAdapter().getItem(position);
        String keyword = o.toString();

        if(keyword=="Categories"){
            Intent cat = new Intent(this, CategoryActivity.class);
            startActivity(cat);
            //Toast.makeText(this, keyword, Toast.LENGTH_LONG).show();
        } else {
            Intent cat = new Intent(this, CategoryActivity.class);
            startActivity(cat);
        }

    }

}

Category.java

public class Category implements Parcelable {

    private int id;
    private String title;

    public Category() {

    }

    public Category(Parcel source) {
        id = source.readInt();
        title = source.readString();
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getId() {
        return this.id;
    }

    public String getTitle() {
        return this.title;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
          dest.writeInt(id);
          dest.writeString(title);
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

        @Override
        public Category createFromParcel(Parcel source) {
            return new Category(source);
        }

        @Override
        public Category[] newArray(int size) {
            return new Category[size];
            // TODO Auto-generated method stub
        }

    };

}

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Расширить ArrayAdapter<T> и расширить его getView() метод. Сделайте так, чтобы это возвращало представление вашего выбора.

Затем используйте его как MyArrayAdapter<Category>.

1 голос
/ 25 ноября 2010

Вот два хороших примера того, как сделать пользовательскую реализацию класса ArrayAdapter:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...