2012-10-18 3 views
5

ListView에서 선택한 행의 배경색을 조작하고 CustomAdapter로 확장해야하는 것을 알고 싶습니다. 내 주 어댑터는 SimpleCursorAdapter 유형이므로 ArrayAdapter를 SimpleCursorAdapter로 확장 한 CustomAdapter를 수정했습니다.SimpleCursorAdapter를 확장하는 Listview 및 CustomAdapter

내 문제는 CustomAdapter를 사용할 때 listview가 비어 있지만 SimpleCursorAdapter를 확장하고 사용하지 않으면 listview에 행/항목이 있다는 것입니다. Logcat에 내 CustomAdapter의 문제가 표시됩니다 (아래 참조).

이 내 주요 활동 코드 :

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

이 사용자 정의 어댑터 클래스입니다 내가 위치를 표시 한 경우 로그 캣 오류 :

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

그리고이 로그 캣입니다 :

10-18 13 : 33 : 17.869 : E/ListView (28378) : android.widget.LinearLayout 10-18 13 : 33 : 17.869 : E/목록 보기 (28378) : java.lang.ClassCastException : android.widget.LinearLayout 10-18 13 : 33 : 17.869 : E/ListView (28378) : com.xxx.xxx.CustomAdapter.getView (CustomAdapter.java:49) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.widget.AbsListView.obtainView (AbsListView.java:1449) 10-18 13 : 33 : 17.869 : E/ListView (28378) : at 목록보기 (28378) : android.widget.ListView.fillSpecific (ListView.java:1339) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.widget.ListView.layoutChildren (ListView.java:1637) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.widget. AbsListView.onLayout (AbsListView.java:1279) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.view.View.layout (View.java:7321) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.widget.FrameLayout.onLayout (FrameLayout.java:338) 10-18 13 : 33 : 17.869 : E/ListView (28378) : at android.view.View.layout (View.java:7321) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.widget.FrameLayout.onLayout (FrameLayout.java:338) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.view.View.layout (View.java:7321) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.view. ViewRoot.performTraversals (ViewRoot.java:1217) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.view.ViewRoot.handleMessage (ViewRoot.java:1991) 10-18 13:33 : E/ListView (28378) : android.os.Looper.loop (Handler.java : 99) 10-18 13 : 33 : 17.869 : E/ListView (28378) : Looper.java : 150) 10-18 13 : 33 : 17.869 : E/ListView (28378) : android.app.ActivityThread.main (ActivityThread.java:4385) 10-18 13 : 33 : 17.869 : E/ListView (28378) : at (네이티브 메소드) 10-18 13 : 33 : 17.869 : E/ListView (28378) : java.lang.reflect.Method.invoke (Method.java:507)에서 10- 18 13 : 33 : 17.869 : E/ListView (28378) : 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) : at dalvik.system.NativeStart.주 (기본 방법)

이것은 로그 캣이있는 LinearLayout 함께 할 수있는 뭔가를 표시하는 레이아웃

<?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> 

하지만 내가 잘못 갈 어디 있는지 알아낼 수 없습니다.

누구든지 올바른 방향으로 나를 안내 할 수 있습니까?

감사 마크

업데이트 : 부모가되어 확인해 볼 때 지금이 오류

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 

을 얻을

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

을 : Sardor의 아이디어에 따라 (감사합니다)를 팽창에 맞게 변경 한 후 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 : 'code' tv = (TextView) mInflater.inflate (viewResourceId, parent); – Mark

0

을이 문제를 건너 올 수 있습니다 다른 사람에 대한 내 작업 코드를 게시 할 수 있습니다 당신의 보다 간단한 방법은 using SimpleCursorAdapter.setViewBinder 일 수 있습니다.

관련 문제