Страница 1 из 1

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

Добавлено: 20 мар 2014, 18:08
alexmx
Доброго времени суток форумчане :)

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

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

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

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

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

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

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

Добавлено: 20 мар 2014, 18:22
rezak90
Делаешь свой кастомный адаптер. В методе getView или bindView (смотря какой адаптер используешь) уже в зависимости от данных подсовываешь нужный бэкграунд.

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

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

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

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

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

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

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

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

Добавлено: 26 мар 2014, 18:47
alexmx
В общем накодил следующее:

Активность
[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, но не могу понять откуда :?:

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

Добавлено: 26 мар 2014, 18:53
alexmx
Извиняюсь нашел
adapter = new ScannerListCursorAdapter(this, R.layout.item, null, null, null);

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

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

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

Добавлено: 27 мар 2014, 16:39
alexmx
В LogCat два раза клацаешь по ошибке и попадаешь на строку.
Спасибо :)


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

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

Добавлено: 30 мар 2014, 13:07
alexmx
Так что то я заблудился. Допустим есть разметка
[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 в данной разметке. Или это как то по другому делается?

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

Добавлено: 30 мар 2014, 13:23
alexmx
То есть можно ли создать LinearLayout с настройками а в зависимости от данных в адаптере толкать в него ссылки например TextView???

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

Добавлено: 30 мар 2014, 14:08
alexmx
Нет не так нужно в TextView подгрузить фон в виде фигуры xml (зависит от данных), и вставить текст

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

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

Добавлено: 30 мар 2014, 14:18
alexmx
Всё понял как:
[syntax=java]if(nameStatCol == null){
stat_name_col.setText("технология");
stat_name_col.setBackgroundResource(R.drawable.rectangle_rounded_all_green);
}[/syntax]