2011-12-03 15 views
6

私はメインのアクティビティにカスタムBaseAdapterと追加ボタンがあります。ボタンはテキストボックスを含むダイアログを開き、そのように新しい要素をリストに追加することができます。問題は、リストがリフレッシュされていないことです。 onActivityResult()関数では、リストの要素数を表示し、ダイアログボックスでOKを押すたびに数値が増加するので、うまくいきません。私BaseAdapterと私の活動:あなたが見ることができるようにAndroid:リストビューは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で、後ダイアログが新しい要素をメインアクティビティに渡します。繰り返しますが、要素数が増加するため、要素ISがリストに追加されます。ちょうど更新されません。

ありがとうございました!

+0

は、なぜあなたはsetListAdapter(リスタ)を呼び出してはいけません。 in OnActivityResult – Abhi

+0

それは仕事をしますが、項目はnullです。 LogCatによると、リストにはStringが必要だが、SpannableStringを取得する。それは何ですか?私はそれをどのように取り除くことができますか?これは、インテントを介してダイアログボックスから取得されます。 – FloIancu

+0

私の答えにいくつかのコードを追加しました。コードを変更していくつかのものを修正し、アレイアダプターを使用して簡素化しました。小さな変更がいくつかありますので、それはあなたに役立ちます。 – gwa

答えて

7

"lista"にアイテムを追加しているのに、アダプタがそのリストのコピーを保持しているか、アダプタのリストを再度設定してから、notifyDataChanged新しい項目をアダプタに追加します。

とにかく私は奇妙なことがいくつか見えます。私はあなたが配列アダプターを使ってすべてを意味することができます、あなたは追加などを実装する必要はありません。私はあなたを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> 

はこれがありますベースアダプターを使用するアダプターのバージョン:

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

そして、これは、リストアイテムのバージョンもWICH左側の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

リスト項目は、使用しているアダプターの種類に関係なく、任意の方法で作成できます。私はベースアダプタバージョンと左にアイコンを含むリスト項目を追加して私の答えを編集しました... – gwa

関連する問題