2016-07-08 5 views
1

アダプタListViewのAndroidが同じ項目に多くの時間を表示します

import ...; 
public class CustomAdapter extends ArrayAdapter<MyObject> { 
    public CustomAdapter(Context context, ArrayList<MyObject> objects) { 
     super(context, 0, objects); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     View view1 = inflater.inflate(R.layout.row, parent, false); 

     MyObject myobj = getItem(position); 
     String objectName = myobj.getName(); 

     TextView name_TV = (TextView) view1.findViewById(R.id.name); 
     name_TV.setText(objectName); 
     return view1; 
    } 
} 

MainActivity

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ArrayList <MyObject> obj_list = new ArrayList<MyObject>(); 
    obj_list.add(new MyObject("user1", 123)); 
    obj_list.add(new MyObject("user2", 123)); 
    obj_list.add(new MyObject("user3", 123)); 

    CustomAdapter adptr = new CustomerAdapter(this, obj_list); 
    ListView lv = (ListView) findViewById(R.id.abcListview); 
    lv.setAdapter(adptr); 
} 

MyObjectにクラス

public class MyObject{ 
    String a; 
    int b; 
    public MyObject(String a, int b){ 
     this.a = a; 
     this.b = b; 
    } 
    public String getName(){ 
     return a; 
    } 
} 

「user1」を1回、「user2」を1回、「user3」を1回印刷する代わりに、3回。上記のコードの

編集 結果は:http://imgur.com/BBJS0wt

+1

は、(1)(2)RecyclerViewを使用してくださいするのに役立ちます(3)MyObjectクラスのポストコード –

+0

@GregEnnis MyObjectクラスのコードを追加しました。私はアンドロイドプログラミングに新しいです、私はRecyclerViewが何であるか分かりません。 – szz

+0

オブジェクトをArrayListに追加する前に、CustomAdapter adptrを作成して設定してみてください。 ArrayListにオブジェクトを追加し、lv.notifyDataSetChanged()を使用します。 同じことをするかどうか確認してください。 – Rob

答えて

1

あなたはViewHolderパラダイムを使用する必要があります。

EDITED

問題は、あなたのgetView()であり、これを試してみてください:

public static class ViewHolder { 

public TextView name; 

} 
MyObject myobj; 

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

    View view1 = convertView; 
    ViewHolder holder; 

    if (null == view1) { 

    holder = new ViewHolder(); 
    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    view1 = inflater.inflate(R.layout.row, parent, null); 

    holder.name = (TextView) view1.findViewById(R.id.name); 

    view1.setTag(holder); 

    } 
    else 
    holder = (ViewHolder) view1.getTag(); 

    myobj = getItem(position); 
    if (myobj == null) 
     return view1; 

    String objectName = myobj.getName(); 
    holder.name.setText(objectName); 

    return view1; 

} 

希望、これはあなたがすることを拒否した場合

+0

私は 'return view1'がelse bracketの後にあるべきだと思います。あなたのコードでは、私が得ている結果は "user3"、 "New text"、 "New text"です。 ( "New text"がデフォルト値です) – szz

+0

@szz回答を編集しました:) –

+0

しかし、私はあなたに 'ListView'の代わりに' RecyclerView'を使うことを提案したいと思います。詳細はこちらをご覧ください(RecyclerViewとAndroid上のCardView入門)(http://code.tutsplus.com/tutorials/getting-started-with-recyclerview-and-android--cms-23465) –

関連する問題