Я создаю макет для Android-приложения, и мне нужно поместить в него список с элементами. Это моя ситуация:

  • Список должен быть в определенной части макета (это я уже решил)
  • Список должен иметь прокрутку, потому что в нем будет много элементов (я думаю, что могу решить это с помощью Scroll View)
  • Элементы должны иметь определенный макет (я тоже знаю, как решить эту проблему)
  • Элементы должны находиться в определенных позициях внутри списка, из-за этого я думаю, что мне пришлось бы использовать фрагмент, который я мог бы спроектировать. Если это правильно, следует ли использовать список фрагментов или простой фрагмент со списком Посмотреть?

enter image description here

0
user2528167 26 Апр 2014 в 22:32

2 ответа

Лучший ответ

Вы должны создать представление списка в 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:id="@+id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </ListView>

</RelativeLayout>

Вам не нужно оборачивать его в режиме прокрутки; он все равно может прокручиваться.

РЕДАКТИРОВАТЬ: Вы можете создать разные файлы макета для каждого фрагмента, если хотите, и использовать разные поля в каждом файле макета. Так что создавайте разные макеты, которые вам нужны, с разными полями.

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

    <ImageView
        android:contentDescription="@string/list_image_description"
        android:id="@+id/icon"
        android:layout_width="60dp"
        android:layout_height="60dp" >
    </ImageView>

    <TextView
        android:id="@+id/row_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/icon"
        android:layout_centerVertical="true"
        android:lines="1"
        android:paddingBottom="5dp"
        android:paddingLeft="5dp"
        android:paddingTop="2dp"
        android:textColor="#000000"
        android:textSize="20sp" />

</RelativeLayout>

Затем вам нужно создать объект списка для хранения данных

package com.jpilfold.jimp3.models;

public class ListRow {

    private String text;
    private byte[] thumbnail;


    public ListRow(String title, byte[] thumbnail) {
        this.text = title;
        this.thumbnail = thumbnail;
    }


    public String getText() {
        return text;
    }


    public byte[] getThumbnail() {
        return thumbnail;
    }
}

Затем создайте адаптер для отображения вашего списка

private List<CustomListRow> rows;
private SQLHelper helper;

public CustomArrayAdapter(Context context, int resource,
        List<CustomListRow> objects) {
    super(context, resource, objects);
    rows = objects;
    helper = new SQLHelper(context);
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    CustomListRow row = this.rows.get(position);
    ViewHolder holder;

    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.custom_list_item, null);
        holder = new ViewHolder();
        holder.icon = (ImageView) view.findViewById(R.id.icon);
        holder.title = (TextView) view.findViewById(R.id.row_title);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
        holder.task.cancel(true);
    }

    if (row != null) {
        holder.title.setText(row.getTitle());
        holder.icon.setVisibility(View.INVISIBLE);
        holder.task = new LoadImageTask(holder);
        holder.task.execute(row);
    }
    return view;
}

static class ViewHolder {
    ImageView icon;
    TextView title;
    LoadImageTask task;
}

private class LoadImageTask extends AsyncTask<CustomListRow, Void, Bitmap> {

    private ViewHolder v;

    public LoadImageTask(ViewHolder v) {
        this.v = v;
    }

    @Override
    protected Bitmap doInBackground(CustomListRow... row) {
        String imagePath = row[0].getFilePath();
        if (!isCancelled() && imagePath != null) {
            byte[] bytes = helper.findThumbnail(imagePath);
            return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (!isCancelled() && bitmap != null) {
            v.icon.setImageBitmap(bitmap);
        } else {
            v.icon.setImageResource(R.drawable.albumart);
        }
        v.spinner.setVisibility(View.INVISIBLE);
        v.icon.setVisibility(View.VISIBLE);
    }

}

РЕДАКТИРОВАТЬ: И, наконец, в вашем ListFragment создайте список этих строк списка и добавьте их в том порядке, в котором вы хотите, чтобы они отображались. У вас могут быть разные фрагменты с разными полями, например:

BigMarginFragment

List<ListRow> rows = new ArrayList<ListRow>();

rows.add(new ListRow("My first item", someImage));
....

setListAdapter(new CustomArrayAdapter, R.layout.big_margin_list_item, rows));

LittleMarginFragment:

List<ListRow> rows = new ArrayList<ListRow>();

rows.add(new ListRow("My first item", someImage));
....

setListAdapter(new CustomArrayAdapter, R.layout.little_margin_list_item, rows));

И вот готовый список

enter image description here

1
user184994 26 Апр 2014 в 19:06

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

Подробнее о фрагментах: http://developer.android.com/guide/components/fragments.html

См. Ответ user184994 о том, как правильно реализовать ListViews с помощью ArrayAdapter.

Руководства по Android API также предлагают хорошее объяснение AdapterViews и привязки к ним данных.

http://developer.android.com/guide/topics/ui/declaring-layout.html#AdapterViews

1
jmcdonnell40 26 Апр 2014 в 18:47