можно ли установить адаптер в линейную компоновку?

19

Можно ли установить адаптер в LinearLayout ?

Я не хочу использовать ListView , так как я использую ScrollView . поэтому я использую LinearLayout ...

В этом я динамически добавляю виды, и теперь мне нужно использовать адаптер. поэтому у кого-нибудь есть предложения?

Я делаю это ...

LinearLayout clientList = (LinearLayout) findViewById(R.id.clients);
adapter = new Sample1AdapterActivity(this, arrayList);
View list = (ListView) getLayoutInflater().inflate(R.layout.user_details, getListView(), false);
    
задан shashi2459 23.07.2014 в 10:16
источник

2 ответа

25

нет, вы не можете. Что вы можете сделать, это раздуть одну строку и добавить в LinearLayout. В псевдокоде:

  LinearLayout linearLayout = (LinearLayout) findViewById(...);
  LayoutInflater inflater = LayoutInflater.from(this);
  for (item in arrayList) {
     View view  = inflater.inflate(R.layout.row, linearLayout, false); 
     // set item content in view
     linearLayout.addView(view)
  }
    
ответ дан Blackbelt 23.07.2014 в 10:20
  • Вы можете воспользоваться некоторыми адаптерами с моим кодом выше (например, обновление макета при обновлении адаптера). –  Vincent Mimoun-Prat 23.07.2014 в 10:36
  • Это определенно возможно, но вы платите за усилия, чтобы написать также адаптер. И в пользовательском getView вам нужно раздувать и заполнять макет в любом случае. +1 от меня @MarvinLabs –  Blackbelt 23.07.2014 в 10:39
  • его работа .... но могу ли я сделать некоторые дальнейшие операции над ним? как обработка событий onClick и т. д.? –  shashi2459 23.07.2014 в 11:10
  • да, вы можете называть setOnClickListener на каждом завышенном виде (если это так, что вы имели в виду) –  Blackbelt 23.07.2014 в 11:11
  • , но как я могу установить разные элементы в разные виды строк? то есть от «for (items in arrayList)», как я могу его использовать? потому что у меня есть несколько элементов на одной строке ... текст, изображение, кнопка ... –  shashi2459 23.07.2014 в 11:18
Показать остальные комментарии
18

Да, вы можете добавить свою собственную реализацию LinearLayout, чтобы получить дочерние представления из адаптера. Тем не менее, моя базовая реализация не будет предоставлять весь код рециркуляции представления, представленный в виде списка.

/**
 * A linear layout that will contain views taken from an adapter. It differs
 * from the list view in the fact that it will not optimize anything and
 * draw all the views from the adapter. It also does not provide scrolling.
 * However, when you need a layout that will render views horizontally and
 * you know there are not many child views, this is a good option.

 *
 * @author Vincent Mimoun-Prat @ MarvinLabs
 */
public class AdapterLinearLayout extends LinearLayout {

    private Adapter adapter;
    private DataSetObserver dataSetObserver = new DataSetObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            reloadChildViews();
        }
    };

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public AdapterLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setOrientation(LinearLayout.HORIZONTAL);
    }

    public AdapterLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(LinearLayout.HORIZONTAL);
    }

    public AdapterLinearLayout(Context context) {
        super(context);
        setOrientation(LinearLayout.HORIZONTAL);
    }

    public void setAdapter(Adapter adapter) {
        if (this.adapter == adapter) return;
        this.adapter = adapter;
        if (adapter != null) adapter.registerDataSetObserver(dataSetObserver);
        reloadChildViews();
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (adapter != null) adapter.unregisterDataSetObserver(dataSetObserver);
    }

    private void reloadChildViews() {
        removeAllViews();

        if (adapter == null) return;

        int count = adapter.getCount();
        for (int position = 0; position < count; ++position) {
            View v = adapter.getView(position, null, this);
            if (v != null) addView(v);
        }

        requestLayout();
    }
}
    
ответ дан Vincent Mimoun-Prat 23.07.2014 в 10:25
  • Отличный ответ! Но один вопрос - как андроид noob, можете ли вы сказать мне, почему setOrientation (LinearLayout.HORIZONTAL); похоже, переопределяет ориентацию VERTICAL I, представленную в XML? Какой-то приоритет? –  Dr. ABT 22.04.2016 в 20:01