2011-12-30 58 views
7

Tôi có một ứng dụng tìm nạp thông báo được lưu trữ dưới dạng tệp xml trên máy chủ và tải tiêu đề và tác giả của từng thông báo vào mục ListView. Những gì tôi cũng cần lưu trữ với mỗi mục là ID của mỗi thông báo nhưng tôi không thực sự cần phải hiển thị nó. Tôi nghĩ về việc lưu trữ ID trong bản đồ băm mà tôi sử dụng để điền vào danh sách và sau đó tìm ID được liên kết với tiêu đề được nhấp nhưng tôi cho rằng nó sẽ không an toàn để sử dụng vì hai thông báo có thể có cùng một tiêu đề (và tác giả và ngày) . Tôi cũng nghĩ về việc thêm một TextView vô hình cho mỗi mục để lưu trữ ID nhưng điều đó đã gây ra các vấn đề bố cục. Cuối cùng, tôi đã tìm kiếm xung quanh và tìm thấy setTag() và getTag() mà tôi nghĩ rằng sẽ hoàn hảo cho những gì tôi muốn làm nhưng tôi không thực sự chắc chắn làm thế nào để sử dụng chúng với SimpleAdapter (tôi là tương đối mới này ...). Nếu ý tưởng TextView là những gì tôi cần phải làm gì (mặc dù tôi nghi ngờ nó), đây là cách bố trí Tôi đang sử dụng cho từng hạng mục:Đính kèm dữ liệu ID vào danh sách xem các mục

<?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="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@android:id/text1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="6dip" 
     android:textAppearance="?android:attr/textAppearanceMedium"/> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:id="@+id/items" 
     android:weightSum="100" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
     <TextView 
      android:id="@android:id/text2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="6dip" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:layout_weight="85"/> 
     <LinearLayout 
      android:orientation="vertical" 
      android:id="@+id/itemCB" 
      android:layout_weight="15" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="center"> 
      <CheckBox 
       android:id="@+id/cbSelected" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

Và tôi đang sử dụng bộ chuyển đổi sau đây để điền vào danh sách:

for(int i = 0; i < ann.length; i++) 
{ 
    map = new HashMap<String, String>(); 
    map.put("line1", ann[i].getTitle()); 
    map.put("line2", "Posted by: " + ann[i].getAuthor() + "\n" + ann[i].date.toLongString()); 
    list.add(map); 
} 
String[] from = { "line1", "line2"}; 

int[] to = { android.R.id.text1, android.R.id.text2}; 

SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.twoline_checkbox_id_listitem, from, to); 
setListAdapter(adapter); 

Cảm ơn bạn đã được trợ giúp!

+0

Tôi nghĩ rằng đây là câu trả lời tốt nhất cho bạn: http://stackoverflow.com/a/3051729/7379190 – AleX

+0

Tôi nghĩ [này] (http : //stackoverflow.com/a/3051729/7379190) là câu trả lời hay nhất cho câu hỏi của bạn. – AleX

Trả lời

3

Về mặt lý thuyết, bạn có thể thực hiện một trong hai cách tiếp cận và có thể nó sẽ hoạt động không có vấn đề gì. Tuy nhiên, về lâu dài, tôi sẽ nói rằng bạn sẽ tốt hơn với một đối tượng thực thể đơn giản và một bộ điều hợp tùy chỉnh. Cụ thể hơn, từ vẻ ngoài của nó, tôi sẽ lựa chọn một ArrayAdapter, và bạn dường như đang sử dụng một số loại đối tượng thực thể đơn giản cho mảng ann.

Có rất nhiều ví dụ có thể chỉ cho bạn cách mở rộng ArrayAdapter. Tuy nhiên phần quan trọng nhất là getView() phương pháp, mà trong đó hầu hết các hình thức cơ bản có thể nhìn một chút như thế này:

public View getView(int position, View convertView, ViewGroup parent) { 
    View row; 
    if (null == convertView) { 
     row = mInflater.inflate(R.layout.list_item, null); 
    } else { 
     row = convertView; 
    } 

    MyObject item = (MyObject) getItem(position); 

    TextView tv = (TextView) row.findViewById(android.R.id.xxx); 
    tv.setText(item.getTitle); 

    // same for other fields/views; e.g. author, date etc 

    return row; 
} 

Thay vì tạo ra một SimpleAdapter, bây giờ tạo ra một thể hiện của CustomAdapter của bạn, vượt qua nó mảng của bạn (hoặc list) của các đối tượng tổ chức nào, và thiết lập toàn bộ như bộ chuyển đổi vào danh sách của bạn:

MyObject[] objects = ... 
setListAdapter(new ArrayAdapter<string>(this, R.layout.list_item, objects)); 

Kể từ bây giờ bạn đang làm việc với các đối tượng trực tiếp, thay vì đầu tiên tạo ra một loạt các chuỗi đại diện ra khỏi các lĩnh vực khác nhau, bạn cũng có thể dễ dàng truy cập vào 'id' của mỗi mục. Thậm chí tốt hơn, bạn có thể thêm rất nhiều trường khác nhau mà không phải lo lắng về nó như thế nào trong danh sách, vì biểu diễn trực quan được xác định bởi những gì bạn đặt (và không đặt) trong phương thức getView() của bộ điều hợp.

+0

Vâng, tôi sợ rằng tôi có thể phải nghiên cứu về cách tạo bộ điều hợp tùy chỉnh của riêng mình. Nó có lẽ là một cái gì đó tôi cần phải học anyway, nhờ sự giúp đỡ! Oh, và mảng 'ann' là một mảng các đối tượng thông báo được tạo ra bằng cách sử dụng trình phân tích cú pháp XML đơn giản, chỉ là fyi. :) – lancex

+0

Tôi hiểu rằng nó có thể là một trở ngại để thực hiện lần đầu tiên, nhưng một khi bạn đã hiểu được điều đó, tôi tin rằng bạn sẽ đồng ý rằng nó đáng để nỗ lực. Đừng lo lắng nếu bạn bị kẹt giữa chừng, luôn có những người trên SO giúp đỡ. :) –

4

Tôi chỉ muốn giải thích chi tiết hơn một chút về câu trả lời của MH.
Trong bạn myArrayAdapter lớp trong getView chức năng bạn có thể gán ID của bạn vào View (mà thực sự có nghĩa là "hàng") như thế này:

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

    View v = convertView; 

    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(mItemLayout, null); 
    } 

    String[] dataForOneRow = this.allRowsData.get(position); 

    // Tag is expected to be an Object (Integer is an object) 
    // our data are in String array - that's why we need to convert it into Integer 
    // I assume here, your ID number is first item (No.0) in the array of data 
    v.setTag(new Integer(Integer.valueOf(dataForOneRow[0]))); 

    /* 
    ...here you will set your data to display in your TextViews... 
    */ 

    return v; 
} 

Và sau đó bạn cần phải biết ID của hàng khi (ví dụ) người dùng nhấp vào hàng và một số Hoạt động chi tiết sẽ bắt đầu.

Tôi có tôi ListView trong Fragment và đây là đoạn mã từ chính Activity của tôi, từ việc kê khai của Fragment, đặt trong hàm onCreateView:

// here we assign "onClick listener" when user clicks a row 
myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Intent myRowClickIntent = new Intent(getActivity(), myDetailActivity.class); 
     // we can send some data to the new Activity through "extras" 
     // remember - our Tag is an object (Integer object) but putExtra() awaits some integer or string or some other type 
     // so here we are saying that it should be understood/treated as an Integer 
     myRowClickIntent.putExtra("item_id", (Integer)view.getTag()); 
     startActivity(myRowClickIntent); 
    } 
}); 

Và cuối cùng ở đây là đoạn mã từ onCreate phương pháp DetailActivity tôi:

Bundle myExtras; 
int myItemId; 

myExtras = getIntent().getExtras(); 
if (myExtras != null) { 
    myItemId = myExtras.getInteger("item_id"); 
} 

Hy vọng nó sẽ giúp ai đó ... :)
tôi cũng mới cho Android.
Big thank you để StackOverflow để được giúp đỡ như vậy trong học tập phát triển Android :)

Các vấn đề liên quan