2016-07-01 14 views
0

ListViewを作成して項目を動的に追加したいと考えています。ここに私のコードは次のとおりです。ListViewが更新されない

CustomAdapter.java:

public class CustomAdapter extends ArrayAdapter<Item>{ 

    Context context; 
    int layoutResourceId; 
    LinearLayout linearMain; 
    ArrayList<Item> data = new ArrayList<Item>(); 

    public CustomAdapter(Context context, int layoutResourceId, 
           ArrayList<Item> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      linearMain = (LinearLayout) row.findViewById(R.id.lineraMain); 

      Item myImage = data.get(position); 

      TextView label = new TextView(context); 
      label.setText(myImage.name); 
      linearMain.addView(label); 

      ImageView image = new ImageView(context); 
      int outImage = myImage.image; 
      image.setImageResource(outImage); 
      linearMain.addView(image); 
     } 
     return row; 
    } 
} 

Item.java:

public class Item { 

    int image; 
    String name; 

    public Item(int image, String name) { 
     super(); 
     this.image = image; 
     this.name = name; 
    } 
    public int getImage() { 
     return image; 
    } 
    public void setImage(int image) { 
     this.image = image; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

GallerF.java

ArrayList<Item> imageArry = new ArrayList<Item>(); 
CustomAdapter adapter; 
ListView dataList; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.activity_gallery, parent, false); 
    dataList = (ListView) v.findViewById(R.id.lista); 

    return v; 
} 
..... 
public void CreateNewListRow(){ 
    imageArry.add(new Item(R.drawable.ek_logo,name)); 
    adapter = new CustomAdapter(getActivity(),R.layout.list,imageArry); 
    dataList.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
} 

たList.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/lineraMain" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:padding="10dp" > 
</LinearLayout> 
私はアプリを実行したときに

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="hu.redbuttonebb.endi.fragmentek20.GalleryF" 
    android:background="@drawable/background" 
    android:id="@+id/linlayout"> 

    <ScrollView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <ListView 
      android:id="@+id/lista" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:drawSelectorOnTop="false" /> 

    </ScrollView> 
</LinearLayout> 

activity_gallery.xml

は、今では正しい絵と名前の1行を作成します。しかし、私がもう1つを作成したいときは、何も起こりません。どこで間違っていますか?

+0

どうやってリストに新しい項目を追加しますか?あなたはそれをした後に 'adapter.notifyDataSetChanged();'を呼びますか? – Titus

+0

私はこの行を使って新しいアイテム 'imageArry.add(新しいアイテム(R.drawable.ek_logo、name));'を追加しています。そして、私は 'adapter.notifyDataSetChanged();'を呼び出しますが、上記のことが分かります。 –

+0

はい、アダプターをリストに設定すると 'adapter.notifyDataSetChanged();'が呼び出されていますが、 'imageArry'リストを変更するたびに呼び出さなければなりません。 – Titus

答えて

2

これであなたのファイルを置き換えアダプタの初期化:

ArrayList<Item> imageArry = new ArrayList<Item>(); 
CustomAdapter adapter; 
ListView dataList; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
View v = inflater.inflate(R.layout.activity_gallery, parent, false); 
dataList = (ListView) v.findViewById(R.id.lista); 

adapter = new CustomAdapter(getActivity(),R.layout.list,imageArry); 
dataList.setAdapter(adapter); 

return v; 
} 
..... 

public void CreateNewListRow(){ 
imageArry.add(new Item(R.drawable.ek_logo,name)); 
imageArry.add(new Item(R.drawable.ek_logo,name)); 
imageArry.add(new Item(R.drawable.ek_logo,name)); 
imageArry.add(new Item(R.drawable.ek_logo,name)); 
imageArry.add(new Item(R.drawable.ek_logo,name)); 
adapter.notifyDataSetChanged(); 
} 

コードの下で編集したList.xmlを:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/lineraMain" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="10dp" > 
</LinearLayout> 

はScrollViewを削除し、リストビューはScrollViewを必要としない:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     tools:context="hu.redbuttonebb.endi.fragmentek20.GalleryF" 
     android:background="@drawable/background" 
     android:id="@+id/linlayout"> 
<ListView 
    android:id="@+id/lista" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:drawSelectorOnTop="false" /> 

</LinearLayout> 
+0

これは機能しません。 –

+0

あなたの行アイテムを表示します。 list.xml。 – Drv

+0

私の質問を編集しました! –

1

アイテムを追加するたびに新しいアダプタを作成しています。

public class CustomAdapter extends ArrayAdapter<Item>{ 

Context context; 
int layoutResourceId; 
LinearLayout linearMain; 
ArrayList<Item> data = new ArrayList<Item>(); 

public CustomAdapter(Context context, int layoutResourceId, 
          ArrayList<Item> data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 

    if (row == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     linearMain = (LinearLayout) row.findViewById(R.id.lineraMain); 

     Item myImage = data.get(position); 

     TextView label = new TextView(context); 
     label.setText(myImage.name); 
     linearMain.addView(label); 

     ImageView image = new ImageView(context); 
     int outImage = myImage.image; 
     image.setImageResource(outImage); 
     linearMain.addView(image); 
    } 
    return row; 
} 

public void addItem(Item item) { 
    data.add(item); 
    notifyDataSetChanged(); 
} 

及びこれにあなたのCreateNewListRowを変更します:あなたはこのように、あなたのアダプタでメソッドを作成し、アイテムを追加するときにそのメソッドを呼び出す必要があり

public void CreateNewListRow(){ 
    adapter.addItem(new Item(R.drawable.ek_logo,name)); 
} 

及びこれにあなたのonCreateを変更します:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.activity_gallery, parent, false); 
    dataList = (ListView) v.findViewById(R.id.lista); 

    adapter = new CustomAdapter(getActivity(),R.layout.list,imageArry); 
    dataList.setAdapter(adapter); 

    return v; 
} 
+0

残念ながら何も動かなかった。それは同じだ。 –

+0

私はちょうどこれをテストし、それは動作します。より多くのコードを共有できますか?たぶんどこか別のところにエラーがあるかもしれません。上記のすべてのコードを変更してもよろしいですか? – babadaba

1

&がBaseAdapterにアダプターを拡張アダプターに、このメソッドを追加

public class FriendsAdapter extends BaseAdapter { 

Activity context; 
ArrayList<String> data = new ArrayList<>(); 
LayoutInflater inflater; 

public FriendsAdapter(Activity c) { 

    context = c; 
    inflater = LayoutInflater.from(this.context); 
} 

public void add(String item) { 

    try { 
     data.add(item); 
    } catch (Exception e) { 

     e.printStackTrace(); 
    } 
    notifyDataSetChanged(); 
} 

public void remove(int position) { 

    try { 
     data.remove(data.get(position)); 

    } catch (Exception e) { 

     e.printStackTrace(); 
    } 
    notifyDataSetChanged(); 
} 


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

@Override 
public String getItem(int position) { 
    return data.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.list_item_friends, parent, false); 
     holder = new ViewHolder(); 

     holder.tvUserName = (TextView) convertView.findViewById(R.id.tvUserName); 

     convertView.setTag(holder); 

    } else { 

     holder = (ViewHolder) convertView.getTag(); 

    } 

    try { 

     holder.tvUserName.setText(data.get(position)); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return convertView; 
} 

private class ViewHolder { 

    TextView tvUserName; 

}} 

FriendsAdaoter adapter = new FriendsAdapter(this); 
list.setAdapter(adapter); 
adapter.add("ABCDEFGHIJKL"); 
+0

tvUserNameとは何ですか? –

+1

tvUserNameはlistItemのテキストビューです –

関連する問題