2011-12-03 60 views
6

我在主要活动中有一个自定义BaseAdapter和一个添加按钮。按钮打开一个带有文本框的对话框,您可以按照这种方式将新元素添加到列表中。问题是,清单不刷新。在onActivityResult()函数中,我打印列表中的元素数量,每次在对话框中点击OK时数字都会增加,所以我知道这只是刷新而无法使用。我BaseAdapter和我的活动:Android:ListView不刷新notifyDataSetChanged();

class ListaOrase extends BaseAdapter{ 
    private Activity context; 
    ArrayList<String> orase; 

    public ListaOrase(Activity context){ 
     this.context=context; 
     orase=new ArrayList<String>(); 
    } 
    public void add(String string){ 
     orase.add(string); 
     this.notifyDataSetChanged(); 
    } 

    public View getView (int position, View convertView, ViewGroup list) { 
     View element; 
     if (convertView == null) 
     { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     element = inflater.inflate(R.layout.lista, null); 
     } 
     else element = convertView; 
     TextView elementLista=(TextView)element.findViewById(R.id.elementLista);  
     elementLista.setText(orase.get(position)); 
     return element; 
    } 

} 

public class WeatherAppActivity extends ListActivity { 

    Button buton; 
    ListaOrase lista; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     lista=new ListaOrase(this); 
     buton=(Button)findViewById(R.id.buton); 


     lista.add("Bucuresti"); 
     lista.add("Sibiu"); 
     setListAdapter(lista); 

    } 

    public void add(View view){ 
     Intent intent=new Intent(); 
     intent.setClass(this, Adauga.class); 
     startActivityForResult(intent, 0); 
    } 

    public void onActivityResult (int requestCode, int responseCode, Intent data){ 
     System.out.println("Apelata"); 
     if(responseCode==1){ 
      lista.add(data.getStringExtra("oras")); // e chiar getText() 
      System.out.println(lista.getCount()); 
      lista.notifyDataSetChanged(); 
     } 
    } 
} 

正如你所看到的,我想刷新(notifyDataSetChanged();)后两者中添加新元素(在BaseAdapter扩展的类)时和方法onActivityResult,对话框将新元素传递给主Activity。我再说一遍,元素被添加到列表中,因为计数增加了,它只是不刷新。

感谢您的回答!

+0

你为什么不叫setListAdapter(LISTA);在OnActivityResult – Abhi

+0

它确实做这项工作,但项目为空。 LogCat表示该列表需要一个字符串,但它会得到一个SpannableString。那是什么,我该如何摆脱它?它通过一个Intent从对话框中获得。 – FloIancu

+0

我添加了一些代码给我的答案,我改变了你的代码修复了一些东西,并简化了使用阵列适配器,还有一些非常重要的小改动,我希望它能帮助你,让我知道! – gwa

回答

7

这是正常的,它不刷新,你正在添加一个项目“lista”,但适配器保留自己的副本的列表,所以或者你再次在适配器中设置列表,然后你调用notifyDataChanged或你将新项目添加到适配器。

无论如何,我看到了一些奇怪的事情,我可以用一个数组适配器将所有东西进行semplify,不需要实现添加等。我写了一些代码simplyfing你:

public class WeatherAppActivity extends ListActivity { 

Button buton; 
ItemsAdapter lista; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    List<String> initialList = new ArrayList<String>(); 
    initialList.add("Bucuresti"); 
    initialList.add("Sibiu"); 

    lista=new ItemsAdapter(this, initialList); 
    buton=(Button)findViewById(R.id.button1); 
    buton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      lista.add(""+System.currentTimeMillis()); // e chiar getText() 
      lista.notifyDataSetChanged(); 

     } 
    }); 

    setListAdapter(lista); 

} 

class ItemsAdapter extends ArrayAdapter<String> { 

    public ItemsAdapter(Context context, List<String> list) { 
     super(context, R.layout.lista, list); 
    } 

    @Override 
    public View getView(final int position, View row, final ViewGroup parent) { 
     final String item = getItem(position); 

     ItemWrapper wrapper = null; 
     if (row == null) { 
      row = getLayoutInflater().inflate(R.layout.lista, parent, false); 
      wrapper = new ItemWrapper(row); 

      row.setTag(wrapper); 
     } else { 
      wrapper = (ItemWrapper) row.getTag(); 
     } 
     wrapper.refreshData(item); 

     return row; 
    } 

    class ItemWrapper { 

     TextView text; 

     public ItemWrapper(View row) { 
      text = (TextView) row.findViewById(R.id.elementLista); 
     } 

     public void refreshData(String item) { 
      text.setText(item); 
     } 

    } 
    }  

} 

这些都是我所使用的XML:

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="63dp" 
    android:text="Button" /> 

<ListView 
    android:id="@id/android:list" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" > 
</ListView> 

</RelativeLayout> 

lista.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/elementLista" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Medium Text" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

</LinearLayout> 

这是使用baseadapter的适配器版本:

class ItemsBaseAdapter extends BaseAdapter { 

private List<String> items; 
private Context mContext; 

public ItemsBaseAdapter(Context context, List<String> list) { 
    items = list; 
    mContext = context; 
} 

public void addItem(String str) { 
    items.add(str); 
} 

@Override 
public View getView(final int position, View row, final ViewGroup parent) { 
    final String item = (String) getItem(position); 

    ItemWrapper wrapper = null; 
    if (row == null) { 
     row = getLayoutInflater().inflate(R.layout.lista, parent, false); 
     wrapper = new ItemWrapper(row); 

     row.setTag(wrapper); 
    } else { 
     wrapper = (ItemWrapper) row.getTag(); 
    } 
    wrapper.refreshData(item); 

    return row; 
} 

class ItemWrapper { 

    TextView text; 

    public ItemWrapper(View row) { 
     text = (TextView) row.findViewById(R.id.elementLista); 
    } 

    public void refreshData(String item) { 
     text.setText(item); 
    } 

} 

@Override 
public int getCount() { 
    return items.size(); 
} 

@Override 
public Object getItem(int position) { 
    return items.get(position); 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 
} 

这是列表项的版本还包括至极的左侧有一个ImageView的:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" > 

<ImageView 
    android:layout_height="wrap_content" 
    android:src="@android:drawable/btn_star_big_on" 
    android:scaleType="fitCenter" 
    android:layout_width="wrap_content" 
    /> 

<TextView 
    android:id="@+id/elementLista" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Medium Text" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    /> 

</LinearLayout>  
+0

Abhi帮助(见上面的评论),但似乎我有一个SpannableString的问题(见答复)。谢谢你的回答! – FloIancu

+0

不幸的是,这项任务需要使用BaseAdapter。更重要的是,我计划在每个项目的左侧添加一个图标,这不能用ArrayAdapter完成。那么SpannableString是什么? – FloIancu

+0

你可以用你想要的任何方式建立列表项,从你正在使用的哪种类型的adapeter中分离出来。我编辑了我的答案,添加了一个baseadapter版本和一个列表项,其中还包括一个左侧的图标... – gwa

相关问题