【问题标题】:ListView: How to add data on custom ArrayAdapter?ListView:如何在自定义 ArrayAdapter 上添加数据?
【发布时间】:2013-06-08 05:37:26
【问题描述】:

为了有一个多彩的 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)

【问题讨论】:

  • 这就是您收到此错误的原因:(stackoverflow.com/a/5125428/833647)
  • 顺便说一下你的对象数组是空的:Target=new String []{""};
  • 是的,我知道,一开始它是空的,但我可以向它添加数据
  • 另外,编码时请尽量遵循 Android 约定。类名应该以大写开头并遵循 CamelCase。如果我们都这样做,即使我们可能不喜欢它或认为它是最好的,它也可以帮助其他编码人员阅读您的代码。 ;) source.android.com/source/code-style.html

标签: android android-listview android-arrayadapter


【解决方案1】:

试试下面的。有一个数组列表。将字符串添加到 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();
    }   
    }

【讨论】:

  • 亲爱的@Raghunandan 无疑你是一个伟大的程序员。如果我能成为你在 Facebook 上的朋友,我将不胜感激。有可能吗?
【解决方案2】:

我不知道这些对你有没有帮助..

根据我的意见,您应该检查您的 xml 文件。 当您使用 getListView() 方法时,您应该声明您的 Listview 对象,如

android:id = @android:id/list

或者

将这些行与您的 ArrayAdpater 一起使用

arrAdapt.setNotifyOnChange(true);

希望这些对你有帮助..

【讨论】:

    【解决方案3】:

    您忘记初始化列表视图,如下所示:

    lstView = (ListView) findViewById(R.id.yourlistview);
    

    然后

    lstView = getListView();
    

    【讨论】:

    • 虽然我扩展了ListActivity我应该初始化listView?
    【解决方案4】:

    要使用 ListActivity,你必须使用 Listview 的 id 作为 - android:id="@android:id/list" 。

    那么只有你可以通过调用-getListView();获取ListView的实例。方法。

    【讨论】:

      【解决方案5】:

      您遇到的是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() 电话将起作用。

      【讨论】:

      • 好吧,它会显示一个包含您当前代码的空列表。这就是你想要的对吗?还是出错了?
      • 你需要在这里向我们展示你在做什么:net.learn2develop.UsingIntent.createtarget.submit(createtarget.java:136)
      • 你添加的方式不对,就是上面那个错误的意思。如果没有更多关于你在做什么的信息,我无法提供更多帮助。
      • 我在我的问题中添加了提交方法
      • 亲爱的@Ken Wolf,**ArrayAdapter ** 让我拥有丰富的 ListView 并且是一个有用的类
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2015-08-06
      • 2023-03-03
      • 2015-03-27
      • 1970-01-01
      相关资源
      最近更新 更多