要拥有丰富多彩的ListView,我创建了自己的ArrayAdapter,但是当我想使用adapter.clear()
或adapter.add()
时,它会给我带来错误。这是代码和错误。
XML文件:
<ListView
android:id="@+id/android:list"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_margin="4dip"
android:layout_weight="1">
</ListView>
适配器:
class stableArrayAdapter extends ArrayAdapter<String> {
HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();
public stableArrayAdapter(Context context, int textViewResourceId, String [] objects)
{
super(context, textViewResourceId, objects);
for (int i = 0; i < objects.length; ++i) {
mIdMap.put(objects[i], i);
}
}
@Override
public long getItemId(int position) {
String item = getItem(position);
return mIdMap.get(item);
}
@Override
public boolean hasStableIds() {
return true;
}
}
Java代码:
public class createtarget extends ListActivity
{
stableArrayAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.createtarget);
lstView = getListView();
lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lstView.setTextFilterEnabled(true);
Target=new String []{""};
adapter = new stableArrayAdapter(this,android.R.layout.simple_list_item_checked, Target);
setListAdapter(adapter);
}
}
添加代码:
public void submit(View view)
{
adapter.add("Hello");
}
错误:
06-08 05:21:11.785: E/AndroidRuntime(3584): FATAL EXCEPTION: main
06-08 05:21:11.785: E/AndroidRuntime(3584): java.lang.IllegalStateException: Could not execute method of the activity
06-08 05:21:11.785: E/AndroidRuntime(3584): at android.view.View$1.onClick(View.java:3599)
06-08 05:21:11.785: E/AndroidRuntime(3584): at android.view.View.performClick(View.java:4204)
06-08 05:21:11.785: E/AndroidRuntime(3584): at android.view.View$PerformClick.run(View.java:17355)
06-08 05:21:11.785: E/AndroidRuntime(3584): at android.os.Handler.handleCallback(Handler.java:725)
06-08 05:21:11.785: E/AndroidRuntime(3584): at android.os.Handler.dispatchMessage(Handler.java:92)
06-08 05:21:11.785: E/AndroidRuntime(3584): at android.os.Looper.loop(Looper.java:137)
06-08 05:21:11.785: E/AndroidRuntime(3584): at android.app.ActivityThread.main(ActivityThread.java:5041)
06-08 05:21:11.785: E/AndroidRuntime(3584): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 05:21:11.785: E/AndroidRuntime(3584): at java.lang.reflect.Method.invoke(Method.java:511)
06-08 05:21:11.785: E/AndroidRuntime(3584): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-08 05:21:11.785: E/AndroidRuntime(3584): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-08 05:21:11.785: E/AndroidRuntime(3584): at dalvik.system.NativeStart.main(Native Method)
06-08 05:21:11.785: E/AndroidRuntime(3584): Caused by: java.lang.reflect.InvocationTargetException
06-08 05:21:11.785: E/AndroidRuntime(3584): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 05:21:11.785: E/AndroidRuntime(3584): at java.lang.reflect.Method.invoke(Method.java:511)
06-08 05:21:11.785: E/AndroidRuntime(3584): at android.view.View$1.onClick(View.java:3594)
06-08 05:21:11.785: E/AndroidRuntime(3584): ... 11 more
06-08 05:21:11.785: E/AndroidRuntime(3584): Caused by: java.lang.UnsupportedOperationException
06-08 05:21:11.785: E/AndroidRuntime(3584): at java.util.AbstractList.add(AbstractList.java:404)
06-08 05:21:11.785: E/AndroidRuntime(3584): at java.util.AbstractList.add(AbstractList.java:425)
06-08 05:21:11.785: E/AndroidRuntime(3584): at android.widget.ArrayAdapter.add(ArrayAdapter.java:179)
06-08 05:21:11.785: E/AndroidRuntime(3584): at net.learn2develop.UsingIntent.createtarget.submit(createtarget.java:136)
06-08 05:21:11.785: E/AndroidRuntime(3584): ... 14 more
06-08 05:21:16.206: E/Trace(3614): error opening trace file: No such file or directory (2)
答案 0 :(得分:7)
尝试以下方法。有一个arraylist。将字符串添加到arraylist并在适配器上调用notifiydatasetchanged()
public class MainActivity extends ListActivity
{
stableArrayAdapter adapter;
ListView lstView;
ArrayList<String> Target = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
lstView = getListView();
lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lstView.setTextFilterEnabled(true);
Target.add("hi");
Target.add("hello");
adapter = new stableArrayAdapter(this,android.R.layout.simple_list_item_checked, Target);
setListAdapter(adapter);
Target.add("myname");
adapter.notifyDataSetChanged();
}
class stableArrayAdapter extends ArrayAdapter<String> {
public stableArrayAdapter(Context context, int textViewResourceId, ArrayList<String> target)
{
super(context, textViewResourceId, target);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Target.size();
}
@Override
public String getItem(int position) {
// TODO Auto-generated method stub
return Target.get(position);
}
@Override
public int getPosition(String item) {
// TODO Auto-generated method stub
return super.getPosition(item);
}
@Override
public boolean hasStableIds() {
return true;
}
}
}
正如肯建议的那样。
public class MainActivity extends ListActivity
{
ListView lstView;
ArrayList<String> Target = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
lstView = getListView();
lstView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lstView.setTextFilterEnabled(true);
Target.add("hi");
Target.add("hello");
;
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked, Target);
setListAdapter(adapter);
Target.add("myname");
adapter.notifyDataSetChanged();
}
}
答案 1 :(得分:3)
我不知道这些可能对你有帮助..
根据我的意见你应该检查你的xml文件..
当您使用getListView()
方法时,您应该声明像Listview的对象
android:id = @android:id/list
或者
将这些行与ArrayAdpater一起使用
arrAdapt.setNotifyOnChange(true);
愿这些帮助你......
答案 2 :(得分:0)
您忘记初始化列表视图,如下所示:
lstView = (ListView) findViewById(R.id.yourlistview);
然后
lstView = getListView();
答案 3 :(得分:0)
您遇到this problem。
您实际上并不需要扩展ArrayAdapter
- 目前它没有为您做任何事情。
而是这样做:
List<String> target = new ArrayList<String>();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked, target);
稍后您的.add()
电话会有效。
答案 4 :(得分:0)
要使用ListActiivity,您必须使用Listview的id作为 - android:id =“@ android:id / list”。
然后只有你可以通过调用 - getListView();来获取ListView的实例;方法。