我希望在我的 ListView 中操作选定行的背景颜色,从阅读中我需要使用 CustomAdapter 进行扩展。我的主要适配器是 SimpleCursorAdapter 类型,因此我修改了一个 CustomAdapter,将 ArrayAdapter 扩展为 SimpleCursorAdapter。
我的问题是当使用 CustomAdapter 时 ListView 是空白的,但如果不扩展和使用 SimpleCursorAdapter ListView 有行/项目。 Logcat 在我的 CustomAdapter 中显示了一个问题,如下所示。
这是我的主要 Activity 代码:
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: 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)
这是布局
<?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 的想法更改以匹配膨胀后(谢谢):
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, R.layout.phrases, data, fields, new int[] { R.id.phrase });
view = getListView();
setListAdapter(dataSource);
关于android - Listview 和 CustomAdapter 扩展 SimpleCursorAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12955532/
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
这个问题有两个部分。在RubyProgrammingLanguage一书中,有一个使用模块扩展字符串对象和类的示例(第8.1.1节)。第一个问题。为什么如果您使用新方法扩展类,然后创建该类的对象/实例,则无法访问该方法?irb(main):001:0>moduleGreeter;defciao;"Ciao!";end;end=>nilirb(main):002:0>String.extend(Greeter)=>Stringirb(main):003:0>String.ciao=>"Ciao!"irb(main):004:0>x="foobar"=>"foobar"irb(main):
假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入
显然在Test::Unit中没有assert_false。您将如何通过扩展断言并添加文件config/initializers/assertions_helper.rb来添加它?这是最好的方法吗?我不想修改test/unit/assertions.rb。顺便说一句,我不认为这是多余的。我使用的是assert_equalfalse,something_to_evaluate。这种方法的问题是很容易意外使用assertfalse,something_to_evaluate。这将始终失败,不会引发错误或警告,并且会在测试中引入错误。 最佳答案
这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi
我在引擎样式插件中有一些代码,其中包含一些模型。在我的应用程序中,我想扩展其中一个模型。通过在初始值设定项中包含一个模块,我已经设法将实例和类方法添加到相关模型中。但是我似乎无法添加关联、回调等。我收到“找不到方法”错误。/libs/qwerty/core.rbmoduleQwertymoduleCoremoduleExtensionsmoduleUser#InstanceMethodsGoHere#ClassMethodsmoduleClassMethodshas_many:hits,:uniq=>true#nomethodfoundbefore_validation_on_crea