Подмена разметка в адаптере

Интерфейс, диалоги, темы, стили, меню
Ответить
Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Подмена разметка в адаптере

Сообщение alexmx » 20 мар 2014, 18:08

Доброго времени суток форумчане :)

Есть какой то адаптер в нем прописывается разметка и поля из бд

Допустим имеем три поля _id, name, signal

в поле signal прописываем значения (например 1 или 2)

Вопрос:
Как сделать так чтобы имея значение поля signal "1" вставлялась одна разметка, имея значение "2" вставлялась другая разметка

Буду рад ссылкам на инфу)

Заранее благодарю :!:

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Подмена разметка в адаптере

Сообщение rezak90 » 20 мар 2014, 18:22

Делаешь свой кастомный адаптер. В методе getView или bindView (смотря какой адаптер используешь) уже в зависимости от данных подсовываешь нужный бэкграунд.
R.id.team
Политика на форуме запрещена

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Подмена разметка в адаптере

Сообщение alexmx » 25 мар 2014, 14:51

А есть какой нибудь ресурс (книга, сайт...)? где развернуто показано что такое адаптер и с чем его едят. Просто погуглив наталкиваюсь на готовые примеры, что в итоге привело меня к неопределенности и запутанности.

AliMan
Сообщения: 34
Зарегистрирован: 18 мар 2014, 19:11

Re: Подмена разметка в адаптере

Сообщение AliMan » 25 мар 2014, 17:54

alexmx писал(а):А есть какой нибудь ресурс (книга, сайт...)? где развернуто показано что такое адаптер и с чем его едят. Просто погуглив наталкиваюсь на готовые примеры, что в итоге привело меня к неопределенности и запутанности.
Да вы батенька видно ничего про if не слышали? Чем не нравится описание использования адаптера из этого сайта? По моему здесь все "разжовано" достаточно подробно что бы понять как это все работает.
http://startandroid.ru/ru/uroki/vse-uro ... apter.html

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Подмена разметка в адаптере

Сообщение alexmx » 25 мар 2014, 18:02

Да вы батенька видно ничего про if не слышали?
Слышал :o :)
Чем не нравится описание использования адаптера из этого сайта? По моему здесь все "разжовано" достаточно подробно что бы понять как это все работает.
http://startandroid.ru/ru/uroki/vse-uro ... apter.html
Здесь идет работа с массивом, а мне нужна работа с курсором. Поэтому и прошу источник из которого можно почерпнуть всю логику работы адаптеров.

Пока остановился на этом http://thinkandroid.wordpress.com/2010/ ... radapters/

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Подмена разметка в адаптере

Сообщение alexmx » 26 мар 2014, 18:47

В общем накодил следующее:

Активность
[syntax=java]package ru.myscanner.scannerth;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.database.Cursor;

import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.widget.ListView;

public class MainActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {


ScannerListCursorAdapter adapter;
final static Uri CATALOG_URI = Uri.parse("content://ru.htsprovider.htspdata/catalogtable");
static final String CATALOG_NAME = "catalogname";
static final String NAME_STATUS = "nstatus";
ListView lvData;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

startService(new Intent(this, CatalogService.class));


adapter = new ScannerListCursorAdapter(this, R.layout.item, null, null, null);
lvData = (ListView) findViewById(R.id.lvData);
lvData.setAdapter(adapter);
getSupportLoaderManager().initLoader(0, null, this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return(new CursorLoader(this, CATALOG_URI, null, null, null, null));
}


@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor);
}


@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}

[/syntax]
Адаптер
[syntax=java]package ru.myscanner.scannerth;

import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.Filterable;
import android.widget.TextView;

public class ScannerListCursorAdapter extends SimpleCursorAdapter implements Filterable {

static final String CATALOG_NAME = "catalogname";
static final String NAME_STATUS = "nstatus";
private int layout;

public ScannerListCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
this.layout = layout;
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {

Cursor c = getCursor();
final LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(layout, parent, false);

int nameCol = c.getColumnIndex(CATALOG_NAME);
String name = c.getString(nameCol);

int statCol = c.getColumnIndex(NAME_STATUS);
String nameStatCol = c.getString(statCol);

TextView name_text = (TextView) v.findViewById(R.id.tvText);
TextView stat_name_col = (TextView) v.findViewById(R.id.tvTextCol);

if (name_text != null) {
name_text.setText(name);
}


if(stat_name_col != null){
stat_name_col.setText("no");
}

return v;
}

@Override
public void bindView(View v, Context context, Cursor c) {

int nameCol = c.getColumnIndex(CATALOG_NAME);
String name = c.getString(nameCol);

int statCol = c.getColumnIndex(NAME_STATUS);
String nameStatCol = c.getString(statCol);

TextView name_text = (TextView) v.findViewById(R.id.tvText);
TextView stat_name_col = (TextView) v.findViewById(R.id.tvTextCol);

if (name_text != null) {
name_text.setText(name);
}

if(stat_name_col != null){
stat_name_col.setText("no");
}
}

}
[/syntax]

адаптер пока для пробы))

Выкидывает портянку:
  • 03-26 13:43:48.554: E/AndroidRuntime(15764): FATAL EXCEPTION: main
    03-26 13:43:48.554: E/AndroidRuntime(15764): java.lang.NullPointerException
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.widget.SimpleCursorAdapter.swapCursor(SimpleCursorAdapter.java:328)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at ru.myscanner.scannerth.MainActivity.onLoadFinished(MainActivity.java:46)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at ru.myscanner.scannerth.MainActivity.onLoadFinished(MainActivity.java:1)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:427)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:395)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.content.Loader.deliverResult(Loader.java:104)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:73)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:35)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:223)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:61)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:461)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.content.ModernAsyncTask.access$500(ModernAsyncTask.java:47)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:474)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.os.Handler.dispatchMessage(Handler.java:99)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.os.Looper.loop(Looper.java:137)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at android.app.ActivityThread.main(ActivityThread.java:4745)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at java.lang.reflect.Method.invokeNative(Native Method)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at java.lang.reflect.Method.invoke(Method.java:511)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    03-26 13:43:48.554: E/AndroidRuntime(15764): at dalvik.system.NativeStart.main(Native Method)
Вижу что приходит null, но не могу понять откуда :?:

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Подмена разметка в адаптере

Сообщение alexmx » 26 мар 2014, 18:53

Извиняюсь нашел
adapter = new ScannerListCursorAdapter(this, R.layout.item, null, null, null);

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Подмена разметка в адаптере

Сообщение rezak90 » 26 мар 2014, 20:09

alexmx писал(а):Здесь идет работа с массивом, а мне нужна работа с курсором. Поэтому и прошу источник из которого можно почерпнуть всю логику работы адаптеров
Принцип работы одинаковый. Адаптер он и в африке адаптер, так как родитель у всех одинаковый.
alexmx писал(а):Вижу что приходит null, но не могу понять откуда :?:
В LogCat два раза клацаешь по ошибке и попадаешь на строку.
R.id.team
Политика на форуме запрещена

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Подмена разметка в адаптере

Сообщение alexmx » 27 мар 2014, 16:39

В LogCat два раза клацаешь по ошибке и попадаешь на строку.
Спасибо :)


Чуть позже выложу что получилось

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Подмена разметка в адаптере

Сообщение alexmx » 30 мар 2014, 13:07

Так что то я заблудился. Допустим есть разметка
[syntax=xml]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layoutAnimation="@anim/controller_text_view"
android:orientation="vertical">
<TextView
android:id="@+id/tvText"
android:layout_width="140pt"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:textSize="18sp">
</TextView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvTextCol"
android:layout_width="40pt"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/rectangle_rounded_all"
android:textColor="#FFFFFF"
android:gravity="center"
android:layout_marginRight="1dp"
android:textSize="14sp">
</TextView>
<TextView
android:id="@+id/tvTextCol1"
android:layout_width="40pt"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/rectangle_rounded_all"
android:textColor="#FFFFFF"
android:gravity="center"
android:layout_marginRight="1dp"
android:textSize="14sp">
</TextView>
<TextView
android:id="@+id/tvTextCol2"
android:layout_width="40pt"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/rectangle_rounded_all"
android:textColor="#FFFFFF"
android:gravity="center"
android:textSize="14sp">
</TextView>
</LinearLayout>
</LinearLayout>[/syntax]
Это все попадает в ListView, но как теперь подменить TextView в данной разметке. Или это как то по другому делается?

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Подмена разметка в адаптере

Сообщение alexmx » 30 мар 2014, 13:23

То есть можно ли создать LinearLayout с настройками а в зависимости от данных в адаптере толкать в него ссылки например TextView???

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Подмена разметка в адаптере

Сообщение alexmx » 30 мар 2014, 14:08

Нет не так нужно в TextView подгрузить фон в виде фигуры xml (зависит от данных), и вставить текст

Я так понимаю надо это:
setBackground(R.drawable.rectangle_rounded_all)
Только как это реализовать?

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Подмена разметка в адаптере

Сообщение alexmx » 30 мар 2014, 14:18

Всё понял как:
[syntax=java]if(nameStatCol == null){
stat_name_col.setText("технология");
stat_name_col.setBackgroundResource(R.drawable.rectangle_rounded_all_green);
}[/syntax]

Ответить