9

Tôi đã đăng cùng một vấn đề một vài lần nhưng nó chưa được giải quyết. Tôi có một số ListFragment và tôi muốn làm nổi bật mục đã chọn trong danh sách. Tôi đã được gợi ý sử dụng "bộ chọn". Tôi không hiểu cách sử dụng bộ chọn này. Lớp học của tôi ListFragment là:Đánh dấu mục được chọn trong "ListFragment"?

// Create an adapter with list of stores and populate the list with 
     // values 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), 
       android.R.layout.simple_list_item_1, StoreList); 
     setListAdapter(adapter); 
     mDbHelper.close(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * Handles the event when an item is clicked on left pane, performs action 
    * based on the selection in left pane 
    * 
    * @see android.app.ListFragment#onListItemClick(android.widget.ListView, 
    * android.view.View, int, long) 
    */ 
    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     String selectedStore = (String) getListAdapter().getItem(position); 
     DetailFragment fragment = (DetailFragment) getFragmentManager() 
       .findFragmentById(R.id.detailFragment); 
     if (fragment != null && fragment.isInLayout()) { 
      v.setBackgroundColor(getResources().getColor(R.color.BLUE)); 
      // passes selectedStore to detail fragment 
      fragment.setText(selectedStore); 

      // getItemList(selectedStore); 

     } 

Sử dụng setBackground đặt màu vĩnh viễn, nhưng tôi muốn nó biến mất khi một mục khác được chọn. Tôi hiểu cách sử dụng bộ chọn trong một ListView nhưng trong trường hợp của tôi nếu tôi chưa xác định bất kỳ xml nào cho Listview thì tôi sẽ sử dụng "bộ chọn" như thế nào? Tôi đang sử dụng android.R.layout.simple_list_item_1 được xác định trước.

+1

Khái niệm "lựa chọn" trong Android cho một 'ListView' là để sử dụng với D-tấm lót, bi điều hướng, phím mũi tên, và các thiết bị trỏ khác. Trên máy tính bảng, có một khái niệm liên quan đến hàng "được kích hoạt", được thiết kế để làm nổi bật mục cuối cùng được chạm vào từ màn hình cảm ứng, để cung cấp ngữ cảnh cho một vật gì đó liền kề với nó (ví dụ: mẫu chi tiết chính). – CommonsWare

Trả lời

4

Tôi đã không nhận được những gì tôi muốn vì vậy tôi tiếp tục đào bới và đưa ra một giải pháp "rẻ" có thể không phải là phương pháp hay nhất nhưng thực hiện công việc. Tôi muốn mục được tô sáng khi được chọn và màu sẽ biến mất khi mục khác được chọn từ danh sáchFragment. Đây là những gì làm việc cho ME tôi xác định một tĩnh View V; và khởi tạo nó V = new View(getActivity()); Sau đó bên trong tôi

onListItemClick (ListView l, Xem v, vị trí int, id dài)

  V.setBackgroundResource(0); 
      v.setBackgroundResource(R.color.BLUE); 
      V = v; 
+2

Thậm chí có thể gọi nó là thực hành xấu thay vì 'không thực hành tốt nhất'; lưu trữ một khung nhìn, giữ một tham chiếu đến hoạt động, trong một đối tượng tĩnh. Qua đó làm rò rỉ hoạt động. – NickL

+3

Bạn sẽ gặp sự cố khi danh sách phát triển lớn hơn màn hình. Bởi vì cùng một chế độ xem sẽ được sử dụng lại cho các mục đã ẩn trước đó, khi chúng được hiển thị và do đó một số trong số chúng có thể được hiển thị "đã chọn". – Stefan

+0

@Stefan Tôi có vấn đề đó. Bạn có biết cách khắc phục điều đó không? http://stackoverflow.com/questions/31442067/list-item-wont-stay-selected-despite-setting-necessary-properties – MacaronLover

6

Từ ListView của bạn, hãy gọi setChoiceMode(ListView.CHOICE_MODE_SINGLE). Sau đó, bất cứ khi nào bạn muốn đánh dấu một mục đã chọn, hãy gọi setItemChecked(index, true).

+4

Điều này không hoạt động nếu bạn sử dụng bộ điều hợp tùy chỉnh với bố cục mục danh sách tùy chỉnh. – Mehmed

4

Tôi đã thử như cũ và tôi không tìm thấy bất kỳ giải pháp tốt nào. Những gì tôi thực sự đang sử dụng mã này để thiết lập người nghe:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
     list_adapter.setSelectedPosition(position); 
     listView.invalidate(); 
    } 
}); 

nơi adapter danh sách xác định phương pháp nào sau đây

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = GuiBuilder.createHeroListItemView(heroes.get(position),getContext(),parent,false); 
    if(position == selected_pos){ 
     rowView.setBackgroundColor((rowView.getResources().getColor(R.color.list_item_selected_color))); 
    } 
    return rowView; 
} 

public void setSelectedPosition(int selected_pos){ 
    this.selected_pos = selected_pos; 
} 

public int getSelectedPosition(){ 
    return selected_pos; 
} 

Đó là, tôi thay đổi nền của mục danh sách lập trình. Hơn nữa để tránh ảnh hưởng nhấp nháy khi nhấn vào yếu tố danh sách Tôi không xác định bất kỳ bộ chọn cho nhà nước ép

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" 
     android:drawable="@drawable/list_item_focused_color" /> 
    <item android:drawable="@drawable/list_item_default_color" /> 
</selector> 

này hoạt động như dự định cho tôi. Tôi không tìm thấy giải pháp nào tốt hơn vì setSelected (true) không hoạt động trên các mục danh sách!

+0

Có vẻ tốt, sẽ thử điều này và cho bạn biết những gì tôi tìm thấy. –

7

Các sau đây đã làm việc cho tôi vì:

res/color/menu_highlight.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
    android:state_pressed="true" 
    android:drawable="@color/red" /> 
    <item 
    android:state_selected="true" 
    android:drawable="@color/red" /> 
    <item 
    android:drawable="@color/white" /> 
</selector> 

res/values ​​/ colors.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<color name="white">#FFFFFF</color> 
<color name="red">#FF0000</color> 
</resources> 

res/layout/menuitem.xml :: (XML cho mỗi mục trong danh sách)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent"> 
    <TextView 
     android:id="@+id/textmenu" 
     android:layout_height="wrap_content" 
     android:text="text" 
     android:textColor="#FFFFFF" 
     android:background="@color/menu_highlight" 
     android:visibility="visible" 
     android:layout_width="fill_parent" /> 
</LinearLayout> 

Cuối cùng , trong lớp ListFragment, thêm View trước đó và thêm đoạn mã sau vào hàm onlistitemclick ..(Đề cập trong ListFragment: highlight selected row)

public class MenuListFragment extends ListFragment{ 

View previous; 

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     //Logic to highlight selected item 
     previous.setSelected(false); 
     v.setSelected(true); 
     previous=v; 
    } 

}  
+0

Điều này nghe có vẻ như nó sẽ bị cùng một vấn đề Stefan đã đề cập đến câu trả lời được chấp nhận: Bạn sẽ có một vấn đề khi danh sách phát triển lớn hơn màn hình. Bởi vì cùng một chế độ xem sẽ được sử dụng lại cho các mục đã ẩn trước đó, khi chúng được hiển thị và do đó một số trong số chúng có thể được hiển thị "đã chọn". –

0

tôi đang

getListView().setItemChecked(0, true); 

sau

setListAdapter(oAdapter); 

khối mã

0

Something tương tự để gõ-a1pha nhưng với selectors, một khi bạn có xem bạn có thể view.setSelected (true) và điều đó sẽ thêm kiểu bạn đã xác định trên y bộ chọn của chúng tôi. bạn cần phải xóa cờ khi hành động được thực hiện.

3

này làm việc rất tốt đẹp cho tôi trong ListFragment, nhưng tôi nghĩ rằng nó hoạt động chỉ dành cho Android 4.0 trở lên. Tôi tạo ra một bố cục đơn giản cho các mục trong danh sách với android:background="?android:attr/activatedBackgroundIndicator (trong trường hợp của Android dưới 4.0 bạn cần phải ceate một tương tự hợp thuộc tính):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="?android:attr/listPreferredItemHeight" 
android:gravity="center_vertical" 
android:background="?android:attr/activatedBackgroundIndicator" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/list_item_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ellipsize="end" 
    android:singleLine="true" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:layout_margin="@dimen/double_view_margin" /> 

Và sau đó, chỉ cần tạo một đơn giản ArrayAdapter sử dụng này bố trí và thiết lập các chế độ lựa chọn để duy nhất:

final ArrayAdapter<String> labelsAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_simple_list_item, R.id.list_item_text, labels); 

setListAdapter(labelsAdapter); 

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Sau đó bạn có thể làm nổi bật các mục cần thiết với setItemChecked phương pháp:

@Override 
public void onListItemClick(final ListView l, final View v, final int position, final long id) { 
    getListView().setItemChecked(position, true); 
} 
+0

Nếu bạn không ghi đè lên 'onListItemClick', thì' ListFragment' sẽ tự động đặt mục đó là đã chọn. Hoặc chỉ cần chắc chắn gọi 'super.onListItemClick (...)'. – Gautam

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