2012-10-18 14 views
5

Desidero modificare i colori di sfondo della riga selezionata nel mio ListView che dalla lettura devo estendere con un CustomAdapter. Il mio adattatore principale è del tipo SimpleCursorAdapter, quindi ho modificato un CustomAdapter che ha esteso ArrayAdapter a SimpleCursorAdapter.Listview e CustomAdapter che estendono SimpleCursorAdapter

Il mio problema è che il listview è vuoto quando si utilizza CustomAdapter ma se non si estende e non si usa SimpleCursorAdapter il listview ha righe/elementi. Logcat mostra un problema nel mio CustomAdapter vedi sotto.

Questo è il mio codice attività principale:

phrasesdb helper = new phrasesdb(this); 
database = helper.getWritableDatabase(); 
data = database.query("phrases", fields, null, null, null, null, fields[0] + " COLLATE NOCASE ASC"); 
//WORKING SimpleCursorAdapter 
//dataSource = new SimpleCursorAdapter(this, R.layout.phrases, data, fields, new int[] { R.id.phrase }); 

//NOT WORKING 
dataSource = new CustomAdapter(this, R.layout.phrases, data, fields, new int[] { R.id.phrase }); 

view = getListView(); 
setListAdapter(dataSource); 

Questa è la classe adattatore personalizzato e ho segnato la posizione in cui gli errori logcat:

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

public class CustomAdapter extends SimpleCursorAdapter { 

protected static final int NO_SELECTED_COLOR = 0xFF191919; 
protected static final int SELECTED_COLOR = 0xFF3366CC; 

Cursor items; 
private LayoutInflater mInflater; 
private int viewResourceId; 
private int selectedPosition; 


public CustomAdapter(Context context, int resourceId, Cursor data, String[] fields, int[] is) { 
    super(context, resourceId, data, fields, is); 
    mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    viewResourceId = resourceId; 
    items = data; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    TextView tv = (TextView)convertView; 
    if (tv == null) { 
    //WHEN DEBUGGING THIS IS WHERE LOGCAT ERROR MESSAGES STARTS 
     tv = (TextView)mInflater.inflate(viewResourceId, null); 
    } 
    tv.setText(items.getString(position)); 



    // Change the background color 
    if (position==selectedPosition) tv.setBackgroundColor(SELECTED_COLOR); 
    else tv.setBackgroundColor(NO_SELECTED_COLOR); 

    return tv; 
} 

public void setSelected(int position) { 
    selectedPosition = position; 
} 
} 

e questo è LogCat:

10-18 13: 33: 17,869: E/ListView (28378): android.widget.LinearLayout 10-18 13: 33: 17,869: E/List Visualizza (28378): java.lang.ClassCastException: android.widget.LinearLayout 10-18 13: 33: 17.869: E/ListView (28378): su com.xxx.xxx.CustomAdapter.getView (CustomAdapter.java:49) 10-18 13: 33: 17,869: E/ListView (28378): su android.widget.AbsListView.obtainView (AbsListView.java:1449) 10-18 13: 33: 17,869: E/ListView (28378): a android.widget.ListView.makeAndAddView (ListView.java:1801) 10-18 13: 33: 17.869: E/ListView (28378): su android.widget.ListView.fillSpecific (ListView.java:1339) 10-18 13: 33: 17.869: E/ListView (28378): su android.widget.ListView.layoutChildren (ListView.java:1637) 10-18 13: 33: 17.869: E/ListView (28378): su android.widget. AbsListView.onLayout (AbsListView.java:1279) 10-18 13: 33: 17.869: E/ListView (28378): su android.view.View.layout (View.java:7321) 10-18 13: 33: 17.869: E/ListView (28378): su android.widget.FrameLayout.onLayout (FrameLayout.java:338) 10-18 13: 33: 17.869: E/ListView (28378): in android.view.View.layout (View.java:7321) 10-18 13: 33: 17.869: E/ListView (28378): su android.widget.FrameLayout.onLayout (FrameLayout.java:338) 10-18 13: 33: 17.869: E/ListView (28378): su android.view.View.layout (View.java:7321) 10-18 13: 33: 17.869: E/ListView (28378): su android.view. ViewRoot.performTraversals (ViewRoot.java:1217) 10-18 13: 33: 17.869: E/ListView (28378): su android.view.ViewRoot.handleMessage (ViewRoot.java:1991) 10-18 13:33: 17.869: E/ListView (28378): su android.os.Handler.dispatchMessage (Handler.java:99) 10-18 13: 33: 17.869: E/ListView (28378): su android.os.Looper.loop (Looper.java:150) 10-18 13: 33: 17.869: E/ListView (28378): su android.app.ActivityThread.main (ActivityThread.java:4385) 10-18 13: 33: 17.869: E/ListView (28378): in java.lang.reflect.Method.invokeNative (Native Method) 10-18 13: 33: 17.869: E/ListView (28378): a java.lang.reflect.Method.invoke (Method.java:507) 10- 18 13: 33: 17.869: E/ListView (28378): a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:849) 10-18 13: 33: 17.869: E/ListView (28378): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:607) 10-18 13: 33: 17.869: E/ListView (28378): in dalvik.system.NativeStart.principale (Native Method)

Questo è il layout

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout android:id="@+id/rowLayout" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal"> 
<TextView 
android:id="@+id/phrase" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_marginLeft="2dp" 
android:layout_marginRight="2dp" 
android:focusable="false" 
android:focusableInTouchMode="false" 
android:text="@string/wordforphrases" 
android:textAppearance="?android:attr/textAppearanceMedium" 
android:visibility="visible"/> 

</LinearLayout> 

Logcat sta indicando qualcosa a che fare con LinearLayout ma non riesco a capire dove ho sbagliato.

Per favore qualcuno potrebbe essere in grado di indicarmi la giusta direzione?

grazie Mark

Aggiornamento: Dopo aver cambiato per abbinare gonfiare come per l'idea di Sardor (Grazie):

tv = (TextView)mInflater.inflate(viewResourceId, parent); 

ora ottengo questo errore

10-18 15:23:22.083: E/ListView(28931): addView(View, LayoutParams) is not supported in AdapterView 
10-18 15:23:22.083: E/ListView(28931): java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView 
10-18 15:23:22.083: E/ListView(28931): at android.widget.AdapterView.addView(AdapterView.java:461) 
10-18 15:23:22.083: E/ListView(28931): at android.view.LayoutInflater.inflate(LayoutInflater.java:416) 
10-18 15:23:22.083: E/ListView(28931): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
10-18 15:23:22.083: E/ListView(28931): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
10-18 15:23:22.083: E/ListView(28931): at com.xxx.xxx.CustomAdapter.getView(CustomAdapter.java:36) 
10-18 15:23:22.083: E/ListView(28931): at android.widget.AbsListView.obtainView(AbsListView.java:1449) 
10-18 15:23:22.083: E/ListView(28931): at android.widget.ListView.makeAndAddView(ListView.java:1801) 
10-18 15:23:22.083: E/ListView(28931): at android.widget.ListView.fillSpecific(ListView.java:1339) 
10-18 15:23:22.083: E/ListView(28931): at android.widget.ListView.layoutChildren(ListView.java:1637) 
10-18 15:23:22.083: E/ListView(28931): at android.widget.AbsListView.onLayout(AbsListView.java:1279) 
10-18 15:23:22.083: E/ListView(28931): at android.view.View.layout(View.java:7321) 
10-18 15:23:22.083: E/ListView(28931): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
10-18 15:23:22.083: E/ListView(28931): at android.view.View.layout(View.java:7321) 
10-18 15:23:22.083: E/ListView(28931): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
10-18 15:23:22.083: E/ListView(28931): at android.view.View.layout(View.java:7321) 
10-18 15:23:22.083: E/ListView(28931): at android.view.ViewRoot.performTraversals(ViewRoot.java:1217) 
10-18 15:23:22.083: E/ListView(28931): at android.view.ViewRoot.handleMessage(ViewRoot.java:1991) 
10-18 15:23:22.083: E/ListView(28931): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-18 15:23:22.083: E/ListView(28931): at android.os.Looper.loop(Looper.java:150) 
10-18 15:23:22.083: E/ListView(28931): at android.app.ActivityThread.main(ActivityThread.java:4385) 
10-18 15:23:22.083: E/ListView(28931): at java.lang.reflect.Method.invokeNative(Native Method) 
10-18 15:23:22.083: E/ListView(28931): at java.lang.reflect.Method.invoke(Method.java:507) 
10-18 15:23:22.083: E/ListView(28931): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
10-18 15:23:22.083: E/ListView(28931): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 
10-18 15:23:22.083: E/ListView(28931): at dalvik.system.NativeStart.main(Native Method) 
10-18 15:23:22.093: D/View(28931): onTouchEvent: viewFlags: 0x18244001 

Durante il controllo genitore è vedere il TextView.

Altri pensieri per favore?

risposta

10

Bene finalmente ho potuto farlo funzionare ...

Il problema qui è che se i dati adattatori personalizzate è da un cursore, quindi è necessario utilizzare Bindview e newView in la classe estesa SimpleCursorAdapter invece di getView.

vi posterò il mio codice di lavoro per chiunque altro che possono venire attraverso questo numero ...

public class CustomAdapter extends SimpleCursorAdapter { 

private int mSelectedPosition; 
Cursor items; 
private Context context; 
private int 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("phrase"); 
    String name = c.getString(nameCol); 

    TextView name_text = (TextView) v.findViewById(R.id.phrase); 
    if (name_text != null) { 
     name_text.setText(name); 
    } 
    return v; 
} 


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


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

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


    TextView name_text = (TextView) v.findViewById(R.id.phrase); 
    if (name_text != null) { 
     name_text.setText(name); 
    } 

    //name_text.setTextColor(Color.GREEN); 

    int position = c.getPosition(); 
    if (mSelectedPosition == position) { 
     v.setBackgroundResource(R.drawable.listviewbackground); 
     v.getBackground().setDither(true); 
    } else { 
     v.setBackgroundColor(Color.BLACK); 
    } 

} 


public void setSelectedPosition(int position) { 
    mSelectedPosition = position; 
    notifyDataSetChanged(); 

} 

E

Cursor data; 
    static final String fields[] = { "phrase", BaseColumns._ID }; 

    dataSource = new CustomAdapter(this, R.layout.phrases, data, fields, new int[] { R.id.phrase }); 
    view = getListView(); 
    setListAdapter(dataSource); 
2

tv = (TextView)mInflater.inflate(viewResourceId,genitore, null);

+0

Grazie, dopo aver modificato la corrispondenza, gonfiare: 'codice' tv = (TextView) mInflater.inflate (viewResourceId, parent); – Mark

Problemi correlati