2012-10-18 7 views
5

Ich möchte Hintergrundfarben der ausgewählten Zeile in meinem ListView bearbeiten, die aus dem Lesen ich mit einem CustomAdapter erweitern muss. Mein Hauptadapter ist vom Typ SimpleCursorAdapter, also habe ich einen CustomAdapter modifiziert, der ArrayAdapter zu SimpleCursorAdapter erweitert hat.Listview und CustomAdapter erweitern SimpleCursorAdapter

Mein Problem ist, dass die Listenansicht leer ist, wenn Sie den CustomAdapter verwenden, aber wenn Sie den SimpleCursorAdapter nicht erweitern und verwenden, hat die Listview Zeilen/Elemente. Logcat zeigt ein Problem in meinem CustomAdapter, siehe unten.

Das ist mein Hauptaktivitätscode:

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); 

Dies ist die kundenspezifische Adapter-Klasse, und ich habe die Position markiert, wo logcat Fehler:

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; 
} 
} 

Und das ist LogCat:

10-18 13: 33: 17.869: E/ListView (28378): android.widget.LinearLayout 10-18 13: 33: 17.869: E/Liste Ansicht (28378): java.lang.ClassCastException: android.widget.LinearLayout 10-18 13: 33: 17.869: E/ListView (28378): um com.xxx.xxx.CustomAdapter.getView (CustomAdapter.java:49) 10-18 13: 33: 17.869: E/ListView (28378): bei android.widget.AbsListView.obtainView (AbsListView.java:1449) 10-18 13: 33: 17.869: E/ListView (28378): um android.widget.ListView.makeAndAddView (ListView.java:1801) 10-18 13: 33: 17.869: E/ListView (28378): um android.widget.ListView.fillSpecific (ListView.java:1339) 10-18 13: 33: 17.869: E/ListView (28378): bei android.widget.ListView.layoutChildren (ListView.java:1637) 10-18 13: 33: 17.869: E/ListView (28378): bei android.widget. AbsListView.onLayout (AbsListView.java:1279) 10-18 13: 33: 17.869: E/ListView (28378): um android.view.View.layout (View.java:7321) 10-18 13: 33: 17.869: E/ListView (28378): bei android.widget.FrameLayout.onLayout (FrameLayout.java:338) 10-18 13: 33: 17.869: E/ListView (28378): um android.view.View.layout (View.java:7321) 10-18 13: 33: 17.869: E/ListView (28378): bei android.widget.FrameLayout.onLayout (FrameLayout.java:338) 10-18 13: 33: 17.869: E/ListView (28378): bei android.view.View.layout (View.java:7321) 10-18 13: 33: 17.869: E/ListView (28378): bei android.view. ViewRoot.performTraversals (ViewRoot.java:1217) 10-18 13: 33: 17.869: E/ListView (28378): um android.view.ViewRoot.handleMessage (ViewRoot.java:1991) 10-18 13:33: 17.869: E/ListView (28378): bei android.os.Handler.dispatchMessage (Handler.java:99) 10-18 13: 33: 17.869: E/ListView (28378): um android.os.Looper.loop (Looper.java:150) 10-18 13: 33: 17.869: E/ListView (28378): bei android.app.ActivityThread.main (ActivityThread.java:4385) 10-18 13: 33: 17.869: E/ListView (28378): um java.lang.reflect.Method.invokeNative (systemeigene Methode) 10-18 13: 33: 17.869: E/ListView (28378): at java.lang.reflect.Method.invoke (Methode.java:507) 10- 18 13: 33: 17.869: E/ListView (28378): unter com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:849) 10-18 13: 33: 17.869: E/ListView (28378): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:607) 10-18 13: 33: 17.869: E/ListView (28378): at dalvik.system.NativeStart.main (native Methode)

Dies ist das 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 etwas anzeigt, mit Linearlayout zu tun, aber ich kann nicht herausfinden, wo ich schief gelaufen.

Bitte würde jemand in der Lage sein, mich in die richtige Richtung zu bringen?

dank Mark

Update: Nach dem Wechsel nach Sardor Idee aufblasen anzupassen (danke):

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

ich jetzt diesen Fehler

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 

Wenn Eltern überprüft wird, das TextView sehen.

Irgendwelche anderen Gedanken bitte?

Antwort

10

Okay, ich es endlich ... arbeiten

Die hier Problem ist, dass, wenn Ihre benutzerdefinierten Adapter Daten von einem Cursor ist, dann müssen Sie Bindview und NewView verwenden in die erweiterte SimpleCursorAdapter-Klasse anstelle von getView.

Ich werde meinen Arbeits-Code für von jemand anderen, der über dieses Problem kommen kann ...

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(); 

} 

Und

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,Eltern, null);

+0

Danke, nach dem Ändern der Übereinstimmung aufzublasen: 'code' tv = (TextView) mInflater.inflate (viewResourceId, Eltern); – Mark