Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
#1

Как сделать LinearLayout в несколько колонок - Программирование Android

02.01.2014, 06:11. Просмотров 195. Ответов 8
Метки нет (Все метки)

Появился вопрос, как сделать LinearLayout в две или несколько колонок, каждый из них содержит как минимум по одной imageview и textview, вставляются в область активити эти layout'ы с помощью layoutinflater, в цикле, в их количество зависит от полученного ответа от сервера. Явный пример того что я имею ввиду, это приложение PlayMarket, вкладка "Набирающие популярность", там в строку расположено по три элемента в котором есть иконка и текстовые view. Ширина этих view зависит от ширины дисплея.
TableLayot не получиться использовать, т.к. количество ячеек в строке будет фиксированное, а пустые ячейки нет смысла создавать, темболее что на одной итерации цикла создается один layout.

Для большего понимания моей идеи, я хочу сделать так с LinearLayout, как в CSS с блоком <DIV> делает свойство float:left;

Как это сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gruzer
8 / 8 / 0
Регистрация: 17.05.2012
Сообщений: 30
02.01.2014, 18:22     Как сделать LinearLayout в несколько колонок #2
Есть Вот Такои Вариант с помошью несколких LinearLayout
Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:orientation="horizontal">
 
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
 
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />
 
    </LinearLayout>
  
</LinearLayout>


Есть Вот Такои Вариант с помошью RelativeLayout

Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
 
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/ic_launcher" />
 
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="5dp"
        android:layout_toRightOf="@+id/imageView1"
        android:text="Title" />
 
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_centerVertical="true"
         android:layout_toRightOf="@+id/imageView1"
        android:text="SubTitle" />
 
    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="" />
 
</RelativeLayout>
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
03.01.2014, 01:11  [ТС]     Как сделать LinearLayout в несколько колонок #3
Gruzer, если я их буду добавлять с помощью addView() в активити, они же не будут становиться в один ряд по несколько, в данном примере они будут занимать место: 1 строка = 1 layout. А мне надо 1 строка = 3 layout.
Вот на картинке привел пример:
Миниатюры
Как сделать LinearLayout в несколько колонок  
VEINHORN
543 / 92 / 22
Регистрация: 16.12.2011
Сообщений: 317
03.01.2014, 18:39     Как сделать LinearLayout в несколько колонок #4
Sanu0074, а не проще ли использовать GridView? Со своим собственным адаптером.
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
03.01.2014, 18:52  [ТС]     Как сделать LinearLayout в несколько колонок #5
Цитата Сообщение от VEINHORN Посмотреть сообщение
Sanu0074, а не проще ли использовать GridView? Со своим собственным адаптером.
Незнаю, как вы себе это представляете? по-подробнее...

суть в том что каждый элемент появляется по 1шт, а не по три или несколько сразу (как строка в GridView), я же в цикле беру их через inflater и по одному добавляю в главное активити.
Например если рассматривать свойство css - float:left, то там если каждый div подгружать по 1шт ajax'ом - то он будет прилипать к своему соседу слева независимо сколько их там в строке, заполняться будет до того как незакончится место в родительском блоке и перейдет на новую строку...
VEINHORN
543 / 92 / 22
Регистрация: 16.12.2011
Сообщений: 317
03.01.2014, 19:00     Как сделать LinearLayout в несколько колонок #6
Layout MainActivity

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<LinearLayout
        android:background="@drawable/search_results_info_module"
        android:layout_marginTop="5dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <GridView
            android:id="@+id/some_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:numColumns="auto_fit" // тут можно указать число колонок
            android:columnWidth="150dp"
            android:stretchMode="columnWidth"
            android:verticalSpacing="2dp"
            android:horizontalSpacing="3dp">
        </GridView>
    </LinearLayout>
Ячейка GridView:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="123"
        android:id="@+id/someid"
        android:textStyle="bold"
        android:textSize="20sp"
        android:layout_margin="3dp"/>
</LinearLayout>
Собственный адаптер:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class YourAdapter extends BaseAdapter {
 
    private static class ViewHolder {
        TextView title;
    }
 
    private Context context;
    private ArrayList<YourType> arrayList;
    private LayoutInflater layoutInflater;
 
 
    public GenreItemAdapter(Context context, ArrayList<YourType> arrayList) {
        this.context = context;
        this.arrayList = arrayList;
        layoutInflater = LayoutInflater.from(context);
    }
 
    @Override
    public int getCount() {
        return arrayList.size();
    }
 
    @Override
    public Object getItem(int position) {
        return arrayList.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
 
        if(convertView == null) {
            convertView = layoutInflater.inflate(R.layout.id_of_your_grid_view_item_layout, null);
            viewHolder = new ViewHolder();
            viewHolder.title = (TextView)convertView.findViewById(R.id.yourid);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder)convertView.getTag();
        }
 
        viewHolder.title.setText(arrayList.get(position).getTitle());
 
        return convertView;
    }
}
Main Activity:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class YourActivity extends ActionBarActivity {
 
    private GridView yourGridView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_main_activity_layout);
 
        yourGridView = (GridView)findViewById(R.id.your_grid_view_id);
        ArrayList<YourType> arrayList = new ArrayList<YourType>();
        YourAdapter yourAdapter = new YourAdapter(this, arrayList);
        yourGridView.setAdapter(yourAdapter);
    }
}
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
03.01.2014, 19:30  [ТС]     Как сделать LinearLayout в несколько колонок #7
VEINHORN, Я вот примерно то что мне нужно нагуглил здесь, более простой пример: http://startandroid.ru/ru/uroki/vse-...-atributy.html
Здесь очень удобно через адаптер создается сетка. Но мне нужно добавлять элементы динамически, т.к. мне надо в цикле брать item"ы для сетки и на каждой итерации их обрабатывать (вешать обработчик событий, на imageView загружать нужную картинку) и потом вставлять в gridview... Как это сделать?
p.s. listview здесь точно не прокатит...

Добавлено через 7 минут
Примерно как-то так: http://stackoverflow.com/questions/8...ems-in-android
Но надо сообразить для моего случая, вот мой пример в одну колонку:
Java
1
2
3
4
5
6
7
8
9
        for(int i=0;i<data.size();i++){
            View item = ltInflater.inflate(R.layout.main_activity_item, rootMain, false);
            TextView name = (TextView) item.findViewById(R.id.name);
            name.setText(data.get(i).get("name").toString());
            
            ImageView icon = (ImageView) item.findViewById(R.id.icon); //.....actions
            rootMain.addView(item);
        
}
где rootMain - это тот LinearLayout - куда вставляются итемы взятые с помощью ltInflater....
то же нужно сделать только для gridView... Немогу сообразить как правильно их туда вставлять? просто вместо LinearLayout сделать gridView задать ей св-ва и делать в цикле тожесамое?
VEINHORN
543 / 92 / 22
Регистрация: 16.12.2011
Сообщений: 317
03.01.2014, 21:38     Как сделать LinearLayout в несколько колонок #8
Sanu0074, все данные в конкретные View(TextView, ImageView и тд. ) добавляются в адаптере. Тоесть добавьте все нужные вам данные в вашу коллекцию, а затем по мере поступления новых добавляйте их так же в коллекцию и вызывайте notifyDataSetChanged().

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
GridView gridView = (GridView)findViewById(R.id.your_grid_view_id);
        ArrayList<String> data = new ArrayList<>();
        arrayList.add("str 1");
        arrayList.add("str 2");
        arrayList.add("str 3");
        YourAdapter yourAdapter = new YourAdapter(data);
        gridView.setAdapter(yourAdapter); // после этого у вас в GridView уже отобразится 3 элемента
 
        for(int i=0;i<data.size();i++) {
            arrayList.add("str 4"); // если вам потом надо добавить новые элементы в GridView просто добавьте их в свою коллекцию
            arrayList.add("str 5");
            yourAdapter.notifyDataSetChanged(); // и вызовете этот метод чтоб ваш adapter узнал об этом.
        }
В коллекции вы можете что угодно передавать в ваш адаптер а в методе getView адаптера установить все данные в нужные View.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2014, 13:13     Как сделать LinearLayout в несколько колонок
Еще ссылки по теме:
Android Отрицательный margin в LinearLayout
Android Отображение ScrollView в LinearLayout
По поводу ListView, LinearLayout? Android
Не работает marginRight в LinearLayout Android
Прослушать на клик LinearLayout Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
04.01.2014, 13:13  [ТС]     Как сделать LinearLayout в несколько колонок #9
спасибо)
Я вот немного переделал ваш адаптер, хочу добавить анимацию к картинке imageview:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class GridViewAdapter extends BaseAdapter {
     
    private static class ViewHolder {
        TextView name;
        ImageView icon;
    }
 
    private Context context;
    private List<HashMap<String, String>> arrayList;
    private LayoutInflater layoutInflater;
 
 
    GridViewAdapter(Context context, List<HashMap<String, String>> data) {
        this.context = context;
        this.arrayList = data;
        layoutInflater = LayoutInflater.from(context);
    }
 
    @Override
    public int getCount() {
        return arrayList.size();
    }
 
    @Override
    public Object getItem(int position) {
        return arrayList.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
 
        if(convertView == null) {
            convertView = layoutInflater.inflate(R.layout.main_activity_item, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.name);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder)convertView.getTag();
        }
 
        Animation animation = AnimationUtils.loadAnimation(context, R.anim.rotate); 
        
        
        viewHolder.name.setText(arrayList.get(position).get("name"));
        viewHolder.icon.startAnimation(animation);
        
        return convertView;
    }
 
 
}
Лог:
Код
01-04 11:07:18.849: E/AndroidRuntime(16720): FATAL EXCEPTION: main
01-04 11:07:18.849: E/AndroidRuntime(16720): java.lang.NullPointerException
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at ru.homeandroid.GridViewAdapter.getView(GridViewAdapter.java:67)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.AbsListView.obtainView(AbsListView.java:2627)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.GridView.onMeasure(GridView.java:1045)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at com.jeremyfeinstein.slidingmenu.lib.CustomViewAbove.onMeasure(CustomViewAbove.java:456)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:728)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:477)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5245)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2586)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.View.measure(View.java:16831)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2189)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1352)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1535)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6364)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.Choreographer.doCallbacks(Choreographer.java:591)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.Choreographer.doFrame(Choreographer.java:561)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.os.Handler.handleCallback(Handler.java:730)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.os.Handler.dispatchMessage(Handler.java:92)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.os.Looper.loop(Looper.java:176)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at android.app.ActivityThread.main(ActivityThread.java:5419)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at java.lang.reflect.Method.invoke(Method.java:525)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
01-04 11:07:18.849: E/AndroidRuntime(16720): 	at dalvik.system.NativeStart.main(Native Method)
Как правильно присвоить анимацию или ресурс для imageView?
Yandex
Объявления
04.01.2014, 13:13     Как сделать LinearLayout в несколько колонок
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru