Я хотел бы использовать макет GridView, чтобы каждый элемент Gridlayout имел свой собственный ListView. Я искал образец кода, но не нашел. Следует ли использовать разные классы адаптеров для GridView и ListView? Заранее спасибо!

Изменить: я создал GridView, который отображает все некоторые плитки, и я хочу, чтобы каждый элемент сетки включал список, поэтому я добавил ListView в макет элементов GridView. К сожалению, у меня проблемы с подключением списка к адаптеру.

Это адаптер gridView :

public class MainViewAdapter extends ArrayAdapter<Category> {
private Context mContext;
private int layoutResourceId;
private ArrayList<Category> mGridData = new ArrayList<Category>();
ArrayAdapter adapter;

public MainViewAdapter(Context mContext, int layoutResourceId, ArrayList<Category> mGridData) {
    super(mContext, layoutResourceId, mGridData);
    this.layoutResourceId = layoutResourceId;
    this.mContext = mContext;
    this.mGridData = mGridData;
}

public void setGridData(ArrayList<Category> mGridData) {
    this.mGridData = mGridData;
    notifyDataSetChanged();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ViewHolder holder;
    String imageUrl;

    if (row == null) {
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.SubListView = (ListView) row.findViewById(R.id.SubList);
        holder.titleTextView = (TextView) row.findViewById(R.id.category_title);
        holder.simpleDraweeView = (SimpleDraweeView) row.findViewById(R.id.category_image);
        row.setTag(holder);
    } else {
        holder = (ViewHolder) row.getTag();
    }

    Category category = mGridData.get(position);
    Log.i("position", "" + position);
    holder.titleTextView.setText(Html.fromHtml(category.getTitle()));
    imageUrl = category.getImage();
    Log.i("image url",imageUrl );
    Uri imageUri = Uri.parse(imageUrl);
    holder.simpleDraweeView.setImageURI(imageUri);

    List SubCategories = category.getSubCateg();
    Log.i("@MainViewAdapter - SubCategories", category.getSubCateg().toString());

    //list SubCategories to ArrayList
    ArrayList<SubCategory> listOfSub = new ArrayList<>(SubCategories.size());
    listOfSub.addAll(SubCategories);
    Log.i("listOfSub",listOfSub.toString());

    //ArrayList to ListView
    holder.SubListView.setAdapter(adapter);

    return row;
}

static class ViewHolder {
    TextView titleTextView;
    SimpleDraweeView simpleDraweeView;
    ListView SubListView;
}}

А вот и адаптер просмотра списка :

public class SubListAdapter extends ArrayAdapter<SubCategory> {
private int layoutResourceId;
private ArrayList<SubCategory> mSubGridData = new ArrayList<SubCategory>();
ArrayAdapter adapter;

private final Context mContext;

public SubListAdapter(Context mContext, int layoutResourceId, ArrayList<SubCategory> mSubGridData) {
    super(mContext, R.layout.subcategory_item, mSubGridData);

    this.layoutResourceId = layoutResourceId;
    this.mContext = mContext;
    this.mSubGridData = mSubGridData;
}

public void setSubGridData(ArrayList<SubCategory> mSubGridData) {
    this.mSubGridData = mSubGridData;
    notifyDataSetChanged();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View row = convertView;
    SubListAdapter.ViewHolder holder;
    String imageUrl;

    if (row == null) {
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.SubTitleTextView = (TextView) row.findViewById(R.id.subCatItemTitle);
        row.setTag(holder);
    } else {
        holder = (SubListAdapter.ViewHolder) row.getTag();

    return rowView;
}

static class ViewHolder {
    TextView SubTitleTextView;
    ListView SubListView;
}}

У меня проблемы со вторым адаптером.

0
Kostas St 5 Июл 2017 в 19:35
Вы можете просто попробовать это, и в случае, если это не сработает, задайте подробный вопрос о том, что вы сделали, и четкое описание того, что не работает. Да, вам понадобится адаптер для каждого списка / сетки.
 – 
David Medenjak
5 Июл 2017 в 19:39

2 ответа

Ответ - да. а также есть другое решение.

  • Добавьте относительный / линейный макет как элементы GridView.
  • В классе адаптера GridView динамически добавляйте подэлементы в @getView (). но я не рекомендую это из-за производительности. загрузка этого вида займет слишком много времени.

Напишите, что вам нужно, тогда я обновлю свой ответ для другого решения (если возможно) Удачи

0
Elias Fazel 5 Июл 2017 в 19:40

Вы просто создаете для него gridView android setAdapter. В этом адаптере создайте layout.xml, в котором есть listView. Затем сделайте это как обычно.

Ps: вы не получите реальную высоту вложенного listView, если используете layout_width = "warp_content". поскольку вложенный listView не может получить реальную высоту с помощью "warp_content"

Измерьте было бы хорошо.

0
Jerry.L 7 Июл 2017 в 05:06