2012-11-27 4 views
13

Tôi nhận thấy rằng TwoLineListItem bị phản đối như các API 17. thay thế vào đó là gì nếu tôi đang thiết lập một bộ chuyển đổi ListActivity như sau ?:ListActivity TwoLineListItem Alternative

ArrayAdapter<File> adapter = new ArrayAdapter<File>(this,android.R.layout.simple_list_item_2,filesArrayList){ 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent){ 
       final TwoLineListItem row; 
       if(convertView == null){ 
        LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        row = (TwoLineListItem)inflater.inflate(android.R.layout.simple_list_item_2, null); 
       }else{ 
        row = (TwoLineListItem)convertView; 
       } 
       row.getText1().setText(filesArrayList.get(position).getTitle()); 
       row.getText2().setText2(filesArrayList.get(position).getDescription()); 
       return row; 
      } 

     }; 
+0

Bạn có thể viết View' rằng có hai văn bản 'View's trong nó với phong cách thích hợp của riêng bạn '. – prprcupofcoffee

Trả lời

15

Đơn giản chỉ cần cắt và dán mã nguồn TwoLineListItem vào một bố cục của riêng bạn:

<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="@+id/text1" 
     android:textSize="16sp" 
     android:textStyle="bold" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <TextView android:id="@+id/text2" 
     android:textSize="16sp" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

</LinearLayout> 

(Chú ý rằng tôi đã thay đổi id cho nhất quán.)

Bây giờ sử dụng một ViewHolder mà giữ tham chiếu đến cả TextV iews:

public View getView(int position, View convertView, ViewGroup parent){ 
    ViewHolder holder; 
    if(convertView == null){ 
     // You should fetch the LayoutInflater once in your constructor 
     LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.list_item_2, null); 

     // Initialize ViewHolder here 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    File file = filesArrayList.get(position); 
    holder.text1.setText(file.getTitle()); 
    holder.text2.setText2(file.getDescription()); 
    return convertView; 
} 
+0

Điều này không hoạt động khi được sử dụng với 'ArrayAdapter's. – SagunKho

6

Đây là cách tôi đã làm nó:

mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_2, mListItems) 
    { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      View row; 
      if(convertView == null) 
      { 
       row = (View)mInflater.inflate(android.R.layout.simple_list_item_2, parent, null); 
      } 
      else 
      { 
       row = (View)convertView; 
      } 
      TextView v = (TextView) row.findViewById(android.R.id.text1); 
      v.setText(mListItems[position]); 
      v = (TextView) row.findViewById(android.R.id.text2); 
      v.setText(mListSubItems[position]); 
      return row; 
     } 
    }; 
ListView lv = (ListView) getActivity().findViewById(R.id.runsListView); 
    lv.setAdapter(mAdapter); 
    lv.setOnItemClickListener(mMessageClickedHandler); 
0

đầu tiên bị phản đối, vì vậy đó không phải là quá xấu cho bạn. Bởi vì nó sẽ được hỗ trợ cho mãi mãi. ;)

If it ain’t broke, don’t fix it.

Bạn có thể tự do sử dụng bất kỳ bố trí! Chỉ cần thêm một số nền tảng để đáp ứng tình trạng chọn nếu bạn đang sử dụng một lựa chọn chế độ, như:

android:background="?android:attr/activatedBackgroundIndicator" 
+2

Ngừng sử dụng cũng giống như để nói rằng một cái gì đó không nên được sử dụng, và trong tương lai có thể không hoạt động như mong đợi. Vậy tại sao lại mạo hiểm nếu bạn biết? –