2013-08-02 23 views
7

getItemIdAtPosition() là một chức năng trong android sử dụng để lấy id của một mục trong danh sách xem được vị thế của mìnhAndroid: có được vị trí của mục trong một listview được id của nó:

là có cách nào làm ngược lại, tức là nhận được vị trí của một mục là một danh sách xem cho id của nó?

+1

Bạn sẽ có một mảng hoặc danh sách mảng đang sao lưu Chế độ xem danh sách của bạn phải không? Tôi khá chắc chắn bạn có thể sử dụng nó để đạt được điều này. – midhunhk

Trả lời

10

No. Bạn phải thực hiện thủ công. Tạo phương thức công khai bên trong bộ điều hợp bạn đang sử dụng; trong phương thức đó, lặp lại các mục bộ điều hợp và kiểm tra từng id mục. Nếu nó là == đến param phương thức, sau đó trả về chỉ mục.

public int getItemPosition(long id) 
{ 
    for (int position=0; position<mList.size(); position++) 
     if (mList.get(position).getId() == id) 
      return position; 
    return 0; 
} 

Cập nhật: Bạn cũng có thể tiết kiệm một HashMap cho vị trí/id trong adapter của bạn, nếu hiệu suất tra cứu đại diện cho một vấn đề đối với trường hợp sử dụng của bạn.

Cập nhật: Nếu bạn muốn sử dụng phương pháp này ngoài bộ chuyển đổi, sau đó sử dụng dưới đây:

private int getAdapterItemPosition(long id) 
{ 
    for (int position=0; position<mListAdapter.getCount(); position++) 
     if (mListAdapter.get(position).getId() == id) 
      return position; 
    return 0; 
} 
+0

u có thể cung cấp mã cho điều đó không? @andrew – user2595281

+0

Bạn cần phải hiểu rằng nó phụ thuộc vào những gì adapter của bạn có chứa ... tuy nhiên, đây là đoạn code trên. –

+0

u có thể cho biết làm thế nào để làm điều đó cùng một chức năng, cho xem danh sách và id, cuz tôi không biết làm thế nào để có được mảng đó? @andrew – user2595281

0

số Tùy thuộc vào những gì bạn đang sử dụng bộ chuyển đổi để sao ListView của bạn id và vị trí có thể giống nhau (tôi chưa xem xét tất cả các lớp con BaseAdapter vì vậy tôi không thể nói chắc chắn). Nếu bạn look at the source code for ArrayAdapter bạn sẽ thấy rằng getItemId thực sự trả về vị trí của đối tượng trong bộ điều hợp. Nếu vị trí và id là như nhau, không cần phải sử dụng một cái để lấy cái kia. Nếu không, bạn chỉ cần tìm kiếm bộ điều hợp cho đối tượng mà bạn đang tìm kiếm - sử dụng vị trí hoặc id - và bạn có thể tìm thấy giá trị khác.

Nếu những gì bạn đang nói đến là nhận các đối tượng bằng cách sử dụng một số khóa duy nhất - tức là một đối tượng mà bạn xác định - có thể thực hiện được. Những gì bạn cần làm là thiết lập bộ điều hợp của mình để chụp HashMap thay vì ArrayList hoặc thông thường List đối tượng. Sau đó, bạn có thể tạo phương thức của riêng bạn để tìm bằng khóa bằng cách kéo giá trị đó từ HashMap.

+1

Không có khả năng. Ví dụ, CursorAdapters. Chưa kể đến hầu hết, nếu không phải tất cả, bộ điều hợp tùy chỉnh. Vì vậy, không dựa hoàn toàn vào ý tưởng rằng các giá trị có thể giống nhau. Đối với HashMap, có, nó là một thay thế cho phương pháp tra cứu danh sách. Nó phụ thuộc vào nhu cầu của bạn. –

+0

Chắc chắn nếu bạn đã viết một bộ điều hợp tùy chỉnh, tất cả các phiên cược sẽ bị tắt. Đã không xem xét các CursorAdapter nên tốt điểm tốt. HashMap vẫn là cách dễ nhất/nhanh nhất để thực hiện điều này. – Rarw

4

Không chắc chắn câu hỏi vẫn mở. Tuy nhiên, tôi nghĩ rằng tôi sẽ chia sẻ làm thế nào tôi đã làm nó để nó có thể giúp một người đang tìm kiếm để làm điều tương tự.

Bạn có thể sử dụng tính năng thẻ của chế độ xem để lưu trữ ánh xạ giữa id của chế độ xem đó và vị trí của nó trong danh sách.

Các tài liệu cho thẻ trên trang web của nhà phát triển Android giải thích nó cũng:

http://developer.android.com/reference/android/view/View.html#Tags

http://developer.android.com/reference/android/view/View.html#setTag(int, java.lang.Object)

http://developer.android.com/reference/android/view/View.html#getTag(int)

Ví dụ: Trong phương pháp getView của bộ chuyển đổi danh sách của bạn, bạn có thể đặt ánh xạ cho id của chế độ xem đó và vị trí của nó trong danh sách, chẳng hạn như:

public View getView (int position, View convertView, ViewGroup parent) 
{ 
    if(convertView == null) 
    { 
      // create your view by inflating a xml layout resource or instantiating a 
      // custom view class 
    } 
    else 
    { 
      // Do whatever you want with the convertView object like 
      // finding a child view that you want to set some property of,etc. 
    } 

    // Here you set the position of the view in the list as its tag 
    convertView.setTag(convertView.getId(),position); 

    return convertView; 
} 

Để lấy lại vị trí của các quan điểm, bạn sẽ làm điều gì đó như:

int getItemPosition(View view) 
{ 
    return view.getTag(view.getId()); 
} 

Một điểm cần lưu ý là bạn không cần phải có một tài liệu tham khảo cho View có vị trí bạn muốn lấy . Cách bạn nắm giữ tham chiếu của Chế độ xem phụ thuộc vào trường hợp cụ thể của bạn.

0

nó quá muộn để trả lời nhưng vì lợi ích ...
ví dụ nếu bạn có listview và bạn muốn nhận được id với nhấp chuột nghe bạn có thể nhận được nó bằng cách >>

cListview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 


      @Override 
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
       // for id or any informations 

           itemID = String.valueOf(catList.get(position).getItemID()); 

// for name or any informations 

            itemName = String.valueOf(catList.get(position).getItemName()); 
Các vấn đề liên quan