2012-08-31 13 views
10

リストを使用してListView()を作成しています。ユーザーはリストに項目を追加できます。しかし、ListViewの上部に表示する項目が必要です。リストを逆順に表示するには、リストの先頭にアイテムを挿入するにはどうすればよいですか?ListViewの上部に新しい項目を表示

+0

データのソースは何ですか?あなたがデータベースからそれを読んでいるならば、あなたは 'order by 'またはそれと同等のものを使ってクエリが返す順序をいつでも変更することができます。 – MrLore

答えて

10

おそらくArrayAdapterを使用し、insert(T, int)メソッドを使用する必要があります。

例:

ListView lv = new ListView(context); 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.id...); 
lv.setAdapter(adapter); 
... 
adapter.insert("Hello", 0); 
+0

私はちょうど私のリストを廃止し、うんざりにアダプタを使用しました。素晴らしい仕事を!ありがとう。 – rphello101

+0

あなたは大歓迎です! – aymeric

20

デフォルトでは、リストは要素を下部に追加します。そのため、追加する新しい要素はすべて下部に表示されます。それはあなたのデータソースに格納されているリストビューは、データを表示する

Collections.reverse(yourList); 
+0

良いアイデアだが、私はリストにアイテムを追加し続け、それを元に戻し続けた。リストの両端にアイテムを交互に追加していた。基本データ型のみを保存するSharedPreferencesでデータを保存する必要があるので、2つのリストを追跡するのは面倒です。 – rphello101

+0

私が探していたwhatiが見つかりました。 thankx – raj

+0

良いですが、オブジェクト+カスタムタグを試してみるとうまくいかない! – delive

3

:あなたが逆の順序でそれをしたい場合は、同様にリストにlistadapter /ビューに

何かを逆に設定する前かもしれません。

データベースに追加するときは、最後に要素を追加する必要があります。したがって、Cursorオブジェクトを介してすべてのデータを取得し、ArrayAdapterに割り当てると、その順序になります。基本的には、データベースの先頭にデータを置くことをお勧めします。

のArrayListを使用して、あなたはSQLiteのを使用している場合や、あなたがorder by使用することができますCollections.reverse(arrayList)でそれを行うことができます。

+0

いいえ、これは間違っていると思います。リストビューの場合は、array/listを入力として渡す必要があります。あなたが挿入のタイムスタンプを持っていない限り、データベースでは何もできません。 – kosa

+0

@南里:ごめんなさい。私が実際に意味していたのは、Cursorオブジェクトを使用してデータベースからデータを取得し、それをArrayAdapterに配置することでした。このようなものhttp://stackoverflow.com/questions/5717732/how-do-i-display-data-from-my-database-in-a-listview。私の答えが更新されます。ご意見ありがとうございます。 – Swayam

0

あなたは常にあなたのオブジェクト内の日付スタンプを持っており、それに基づいて、あなたのリストビューを並べ替えることができが..

public class CustomComparator implements Comparator<YourObjectName> { 
     public int compare(YourObjectName o1, YourObjectName o2) { 
      return o1.getDate() > o2.getDate() // something like that.. google how to do a compare method on two dates 
     } 
    } 

が今、あなたのリストを並べ替える

Collections.sort(YourList, new CustomComparator()); 

この最新のアイテムが上に行くようにリストをソートする必要があります

0

代わりにLinkedListを使用して、addFirst()メソッドを使用してリストに要素を追加することで、目的の動作(ListViewの上部に新しい項目)を持たせることができます。元のリストを変更せず

14

別の解決策は、アダプタ

更新
@Override 
public Item getItem(int position) { 
    return super.getItem(getCount() - position - 1); 
} 

でのgetItem()メソッドをオーバーライドする:例

public class ChatAdapter extends ArrayAdapter<ChatItem> { 
public ChatAdapter(Context context, List<ChatItem> chats) { 
    super(context, R.layout.row_chat, chats); 
} 

@Override 
public Item getItem(int position) { 
    return super.getItem(getCount() - position - 1); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertView == null) { 
     convertView = inflater.inflate(R.layout.row_chat, parent, false); 
    } 

    ChatItem chatItem = getItem(position); 
    //Other code here 

    return convertView; 
} 

}

+1

これは非常に洗練されたソリューションです。私はデータ項目を公開しない匿名のArrayAdaptersで使用できるようにマイナーな変更を加えました: 'return super.getItem(getCount() - 1 - position); ' –

+0

これは動作しますが、リストの最初の項目をスクロールするとき最後のアイテムリストと重複しているようです。この問題はリストビュー項目のリサイクルに関係していると思います。 –

+0

アダプタでgetItem()メソッドをオーバーライドする方法を教えてください。 – Apurva

1

mBlogListはリサイクラ図です...

mBlogList=(RecyclerView) findViewById(R.id.your xml file); 
mBlogList.setHasFixedSize(true); 


LinearLayoutManager mLayoutManager = new LinearLayoutManager(this); 
mLayoutManager.setReverseLayout(true); 
mLayoutManager.setStackFromEnd(true); 
mBlogList.setLayoutManager(mLayoutManager);//VERTICAL FORMAT 
0

リストの先頭に要素を追加することができます。

arraylist.add(0, object) 

次に、新しい要素が常に上部に表示されます。

関連する問題