我希望操纵ListView中所选行的背景颜色,从阅读中我需要使用CustomAdapter进行扩展.我的主适配器是SimpleCursorAdapter类型,所以我修改了一个将ArrayAdapter扩展为SimpleCursorAdapter的CustomAdapter.
我的问题是使用CustomAdapter时listview是空白但如果不扩展并使用SimpleCursorAdapter,listview有行/项.
Logcat在我的CustomAdapter中显示一个问题,见下文.
这是我的主要活动代码:
phrasesdb helper = new phrasesdb(this);
database = helper.getWritableDatabase();
data = database.query("phrases",fields,null,fields[0] + " COLLATE NOCASE ASC");
//WORKING SimpleCursorAdapter
//dataSource = new SimpleCursorAdapter(this,R.layout.phrases,data,new int[] { R.id.phrase });
//NOT WORKING
dataSource = new CustomAdapter(this,new int[] { R.id.phrase });
view = getListView();
setListAdapter(dataSource);
这是Custom Adapter类,我已经标记了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,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: E/ListView(28378): android.widget.LinearLayout
10-18 13:33:17.869: E/ListView(28378): java.lang.ClassCastException: android.widget.LinearLayout
10-18 13:33:17.869: E/ListView(28378): at com.xxx.xxx.CustomAdapter.getView(CustomAdapter.java:49)
10-18 13:33:17.869: E/ListView(28378): at android.widget.AbsListView.obtainView(AbsListView.java:1449)
10-18 13:33:17.869: E/ListView(28378): at android.widget.ListView.makeAndAddView(ListView.java:1801)
10-18 13:33:17.869: E/ListView(28378): at android.widget.ListView.fillSpecific(ListView.java:1339)
10-18 13:33:17.869: E/ListView(28378): at android.widget.ListView.layoutChildren(ListView.java:1637)
10-18 13:33:17.869: E/ListView(28378): at android.widget.AbsListView.onLayout(AbsListView.java:1279)
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): at 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): at 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): at android.view.ViewRoot.performTraversals(ViewRoot.java:1217)
10-18 13:33:17.869: E/ListView(28378): at android.view.ViewRoot.handleMessage(ViewRoot.java:1991)
10-18 13:33:17.869: E/ListView(28378): at android.os.Handler.dispatchMessage(Handler.java:99)
10-18 13:33:17.869: E/ListView(28378): at android.os.Looper.loop(Looper.java:150)
10-18 13:33:17.869: E/ListView(28378): at android.app.ActivityThread.main(ActivityThread.java:4385)
10-18 13:33:17.869: E/ListView(28378): at java.lang.reflect.Method.invokeNative(Native Method)
10-18 13:33:17.869: E/ListView(28378): at java.lang.reflect.Method.invoke(Method.java:507)
10-18 13:33:17.869: E/ListView(28378): at 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 Method)
这是布局
Logcat表示与LinearLayout有关,但我无法弄清楚我哪里出错了.
请任何人能够朝着正确的方向发展我吗?
谢谢
标记
更新:根据Sardor的想法(谢谢你)更改为匹配膨胀之后:
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.
还有其他想法吗?
这里的问题是,如果您的自定义适配器数据来自Cursor,那么您必须在扩展的SimpleCursorAdapter类中使用bindView和newView而不是getView.
我会为可能遇到此问题的其他人发布我的工作代码…
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,new int[] { R.id.phrase });
view = getListView();
setListAdapter(dataSource);