2012-07-01 2 views
3

IM 클라이언트를 작성 중이며 파일 시스템 또는 네트워크에서 다운로드하고 ListView 맨 위에 새 요소를 표시해야합니다 (메시지 기록 - 오래된 메시지는 맨 위, 맨 아래). 내 자신의 어댑터에 대한 ListView 구현하지만 목록의 시작 부분에 새 요소를 추가하고 다시 그릴 수 없습니다. (NotifyDataSetChanged()는 ListView의 메시지 인덱스가 변경되고 android가 정상적으로 다시 그릴 수 없기 때문에 나에게 좋지 않습니다.)ListView 맨 위에 새 요소 추가

다른 앱과 비슷한 점이 있나요?

나는 그것을위한 특별한 코드를 생성하지 않는, 단순히 내 ListView에 새로운 어댑터를 만드는 오전 : MessagesListAdapter에서

messagesListView.setAdapter(new MessagesListAdapter(this)); 

을 그리고 재정의 getView() 및 getCount() 메소드 (현재 ArrayAdapter와 확장). ListView에 대한

내 XML은 다른 코드가 필요

<ListView 
    android:id="@+id/dialog_messages_list" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:layout_marginTop="@dimen/title_height"> 
</ListView> 

그리고 하나 개의 요소 (하나의 메시지)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/dialogMessageText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="" 
     android:background="@drawable/dialog_message_in" 
     /> 

    <TextView 
    android:id="@+id/dialogMessageDatetime" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text=""/> 

</LinearLayout> 

될 수 있습니다 내 XML인가?

편집 : 나는

messagesListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList)); 
    (new Thread() { 
     public void run() { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      arrayList.add(0, "qwer"); 
     } 
    }).start(); 

을 시도했다 그러나 그것은 또한 좋지 않은 것 같다. 스레드에서 ((ArrayAdapter<String>)messagesListView.getAdapter()).notifyDataSetChanged();에 전화를 걸려고했으나 예외가 발생했습니다.

+0

관련 코드 및 오류 메시지를 게시하십시오. 이 작업을 수행하는 방법은 여러 가지 ** 있습니다 **. 나는 ListView 나 Adapter가 아닌 어떻게 역사가 정렬되는지에 초점을 맞출 것이다. – Sam

+0

죄송합니다, @Sam, 나는 StackOverflow 의견에 정통합니다. 죄송합니다. 예를 들어 히스토리는 단순히 ArrayList 입니다. 그러나 언젠가는 새로운 요소를 맨 앞에 추가하려고합니다. 그것은 단순한 것이라면 Deque 일 수 있습니다. 당신이 정확하게 질문하는 것을 이해합니까? –

+0

좋아, ArrayList 을 작성하여 ListView를 채우시겠습니까? – Sam

답변

0

목록보기와 연결된 클래스에서 일부보기를 프로그래밍 방식으로 추가 할 수 있습니다. 예를 들어 :

는 레이아웃에 물건을 추가하고 새로운 요소를 만들려면 :

TextView tv = new TextView(getApplicationContext()); 
EditText edit = new EditText(getApplicationContext()); 
relative.addView(tv); 
relative.addView(edit); 

이것은 XML 레이아웃에서 기존 요소를 조작하는 것입니다 : 당신이 중 일부를 보면

final TextView tv = (TextView) v.findViewById(R.id.listItem); 
    tv.setText("This an item I am changing"); 

을 관련 질문, 그들은 이것에 대한 자세한 정보를 제공 할 것입니다. 그러나 다른 사람들의 사용자 정의 목록보기 및 어댑터를 온라인으로 체크 아웃 할 수도 있습니다. 이건 정말 좋다 : http://www.androidhive.info/2012/02/android-custom-listview-with-image-and-text/

+0

그러나 documentatoin (http://developer.android.com/reference/android/widget/ListView.html)에 따라 ListView에 뷰를 추가 할 수 없습니다. 그리고 저는 정말로 그럴 수 없습니다, 예외가 있습니다. –

+0

어떤 예외가 있습니까? –

+0

@ jeremy-d, "java.lang.UnsupportedOperationException : addView (View)가 AdapterView에서 지원되지 않습니다." –

1

나는 목록의 순서를 바꾸어 새로운 결과를 먼저 표시하는 것이 좋습니다.

실행이 예 :

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

     String[] array = {"oldest", "older", "old", "new", "newer"}; 
     List<String> list = new ArrayList<String>(); 
     Collections.addAll(list, array); 
     Collections.reverse(list); 

     // When you want to add new Strings, put them at the beginning of list 
     list.add(0, "newest"); 

     ListView listView = (ListView) findViewById(R.id.list); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list); 
     listView.setAdapter(adapter); 
    } 
} 

이 식으로 ArrayAdapter와 나 ListView에 아무것도를 오버라이드 (override) 할 필요가 없습니다.

+0

코드로 EDIT를 참조하십시오. –

관련 문제