2013-06-08 2 views
3

Чтобы иметь красочный ListView, я создал свой собственный ArrayAdapter, но когда я хочу использовать adapter.clear() или adapter.add(), он дает мне ошибки. Вот код и ошибки.ListView: Как добавить данные на пользовательский ArrayAdapter?

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

Именно поэтому вы получаете эту ошибку: (http://stackoverflow.com/a/5125428/833647) –

+0

Ваш массив объектов пуст, кстати: 'Target = новая строка [] {""}; ' –

+0

Да, я знаю, вначале это пусто, но я могу добавить данные к этому – Salman

ответ

7

Пробуйте ниже. иметь архаиста. добавить строку в 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; 
    } 

} 
} 

Как предложил ken.

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

enter image description here

+2

Уважаемый @ Raghunandan, несомненно, вы отличный программист. Буду признателен, если я могу быть вашим другом в Facebook, возможно ли это? – Salman

0

вы забыли инициализировать ваш ListView, как показано ниже:

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

, а затем

lstView = getListView(); 
+0

Хотя i _extends ListActivity_ i должен инициализировать listView? – Salman

+0

-I отредактировал вопрос plz review it – Salman

3

Я не знаю, это может помочь вам или нет ..

По моему мнению, вы должны проверить свой xml-файл. Когда вы используете getListView() метод вы должны объявить Объект Listview как

android:id = @android:id/list 

Или

использовать эти линии с ArrayAdpater

arrAdapt.setNotifyOnChange(true); 

Может это поможет вам ..

+0

Я отредактировал вопрос plz review it – Salman

+0

См. Мой отредактированный ответ buddy .. –

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() вызов будет работать.

+0

Спасибо, человек, но он не работает – Salman

+0

Ну, он покажет пустой список с вашим текущим кодом. Это то, что вы хотите? Или это ошибка? –

+0

Это ошибка: java.lang.UnsupportedOperationException – Salman

0

Чтобы использовать ListActiivity, вы должны использовать id of Listview as-android: id = "@ android: id/list".

Тогда вы можете получить экземпляр ListView, вызвав - getListView(); метод.

Смежные вопросы