2012-10-18 50 views
5

विस्तारित करना मैं अपनी सूची दृश्य में चयनित पंक्ति के पृष्ठभूमि रंगों में हेरफेर करना चाहता हूं जो पढ़ने से मुझे कस्टम एडाप्टर के साथ विस्तार करने की आवश्यकता है। मेरा मुख्य एडाप्टर SimpleCursorAdapter प्रकार का है, इसलिए मैंने एक कस्टम एडाप्टर संशोधित किया है जो सरल CursorAdapter पर ArrayAdapter को बढ़ाया गया है।Listview और CustomAdapter SimpleCursorAdapter

मेरी समस्या यह है कि कस्टमएडाप्टर का उपयोग करते समय सूचीदृश्य खाली है, लेकिन यदि सरल नहीं है और SimpleCursorAdapter का उपयोग नहीं करते हैं तो सूचीदृश्य में पंक्तियां/आइटम होते हैं। लॉगकैट मेरे कस्टम एडाप्टर में एक समस्या दिखाता है नीचे देखें।

यह मेरा मुख्य गतिविधि कोड है:

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

यह कस्टम एडाप्टर वर्ग है और मैं स्थिति में चिह्नित किया है जहां 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; 
} 
} 

और यह LogCat है:

10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.widget.LinearLayout 10-18 13: 33: 17.869: ई/सूची देखें (28378): java.lang.ClassCastException: android.widget.LinearLayout 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): com.xxx.xxx.CustomAdapter.getView (CustomAdapter.java:49) पर 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.widget.AbsListView.obtainView (AbsListView.java:1449) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): पर android.widget.ListView.makeAndAddView (ListView.java:1801) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.widget.ListView.fillSpecific (ListView.java:1339) 10-18 पर 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.widget.ListView.layoutChildren (ListView.java:1637) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.widget पर। AbsListView.onLayout (AbsListView.java:1279) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.view.View.layout (View.java:7321)पर10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.widget.FrameLayout.onLayout (FrameLayout.java:338) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): at android.view.View.layout (View.java:7321) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.widget.FrameLayout.onLayout (FrameLayout.java:338) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.view.View.layout (View.java:7321) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.view पर। ViewRoot.performTraversals (ViewRoot.java:1217) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.view.ViewRoot.handleMessage (ViewRoot.java:1991) 10-18 13:33: 17.869: ई/लिस्ट व्यू (28378): android.os.Handler.dispatchMessage (हैंडलर.जावा:99) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.os.Looper.loop पर (Looper.java:150) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): android.app.ActivityThread.main (ActivityThread.java:4385) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): at java.lang.reflect.Method.invokeNative (मूल विधि) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): java.lang.reflect.Method.invoke (method.java:507) 10- 18 13: 33: 17.869: ई/लिस्ट व्यू (28378): com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:849) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): com.android.internal.os.ZygoteInit.main पर (ZygoteInit.java:607) 10-18 13: 33: 17.869: ई/लिस्ट व्यू (28378): dalvik.system.NativeStart पर।मुख्य (मूल निवासी विधि)

यह लेआउट

<?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 LinearLayout के साथ कुछ का संकेत है, लेकिन मैं समझ नहीं मैं कहाँ गलत हो गया है।

कृपया कोई मुझे सही दिशा में पोंटने में सक्षम होगा?

धन्यवाद मार्क

अद्यतन: Sardor के विचार के अनुसार बढ़ (thankyou) मैच के लिए बदलने के बाद:

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

मैं अब जब माता-पिता की जाँच यह है इस त्रुटि

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 

मिल TextView देख रहे हैं।

कोई अन्य विचार कृपया?

उत्तर

10

ठीक है, मैं अंत में यह काम करने के लिए मिल गया ...

यहां मुद्दा यह है कि अगर अपने कस्टम एडेप्टर डेटा एक कर्सर से है, तो आप में bindView और newview का उपयोग करना चाहिए है getView के बजाय विस्तारित SimpleCursorAdapter क्लास।

मैं किसी और को, जो इस मुद्दे को सामने आने के लिए मेरे कार्य कोड पोस्ट करेंगे ...

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

} 

और

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,माता पिता, null);

+0

धन्यवाद, मैच inflate में बदलने के बाद: 'कोड' टीवी = (टेक्स्ट व्यू) mInflater.inflate (viewResourceId, पैरेंट); – Mark

0

आप में आइटम के प्रदर्शन को अनुकूलित करने के लिए कोशिश कर रहे हैं अपने लेआउट, एक सरल विधि using SimpleCursorAdapter.setViewBinder हो सकती है।