Cách sử dụng ArrayAd CHƯƠNG <myClass>


129
ArrayList<MyClass> myList = new ArrayList<MyClass>();

ListView listView = (ListView) findViewById(R.id.list);

ArrayAdapter<MyClass> adapter = new ArrayAdapter<MyClass>(this, R.layout.row,
    to, myList.);
listView.setAdapter(adapter);

Lớp: MyClass

class MyClass {
    public String reason;
    public long long_val;
}

Tôi đã tạo row.xml trong các bố cục, nhưng không biết cách hiển thị cả lý do và long_val trong ListView bằng ArrayAd CHƯƠNG.

Câu trả lời:


155

Triển khai bộ điều hợp tùy chỉnh cho lớp của bạn:

public class MyClassAdapter extends ArrayAdapter<MyClass> {

    private static class ViewHolder {
        private TextView itemView;
    }

    public MyClassAdapter(Context context, int textViewResourceId, ArrayList<MyClass> items) {
        super(context, textViewResourceId, items);
    }

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

        if (convertView == null) {
            convertView = LayoutInflater.from(this.getContext())
            .inflate(R.layout.listview_association, parent, false);

            viewHolder = new ViewHolder();
            viewHolder.itemView = (TextView) convertView.findViewById(R.id.ItemView);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        MyClass item = getItem(position);
        if (item!= null) {
            // My layout has only one TextView
                // do whatever you want with your string and long
            viewHolder.itemView.setText(String.format("%s %d", item.reason, item.long_val));
        }

        return convertView;
    }
}

Đối với những người không quen thuộc với khung Android, điều này được giải thích chi tiết hơn ở đây: https://github.com/codepath/android_guides/wiki/Using-an-ArrayAd Module- with- ListView .


2
Xin lỗi, MyClass item = items.get (vị trí) giải quyết lỗi, không khớp với các biến của tôi.
Sumit M Asok

1
Tôi đã xóa trường mục khỏi mã ở trên, vì nó có thể dễ dàng dẫn đến lỗi - ví dụ: nếu ai đó thay đổi danh sách nội bộ của các mục bằng cách sử dụng adapter.clear () hoặc adapter.add (...)
giả gái

1
Tôi có đúng không khi cho rằng textViewResourceIdkhông được sử dụng ở trên?
gerrytan

8
viewHolder đến từ đâu?
Gerry

2
R.layout.listview_association là gì? Đó có phải là bố cục tùy chỉnh của bạn? Tôi có thể thay thế nó bằng android.R.layout.simple_list_item_1 không?
Donato

76

Bạn chỉ có thể thêm một toString()phương thức vào MyClass, mỗi http://developer.android.com/reference/android/widget/ArrayAd Module.html :

Tuy nhiên, TextView được tham chiếu, nó sẽ được điền với toString () của từng đối tượng trong mảng. Bạn có thể thêm danh sách hoặc mảng của các đối tượng tùy chỉnh. Ghi đè phương thức toString () của các đối tượng của bạn để xác định văn bản nào sẽ được hiển thị cho mục trong danh sách.

class MyClass {

 @Override
 public String toString() {
  return "Hello, world.";
 }
}

20
Mặc dù giải pháp đơn giản nhất, đây là (IMHO) không phải là một ý tưởng hay. Ba lý do: Nếu bạn cần nội địa hóa, bạn sẽ phải cấu trúc lại. Điều này chỉ hoạt động nếu bạn có 1 bộ chuyển đổi, nếu bạn có 2 bộ điều hợp khác nhau MyClass, bạn sẽ phải cấu trúc lại. Cuối cùng, nói chung là một ý tưởng tồi để gắn logic trình bày với các mô hình của bạn. Các mô hình không nên nhận thức về cách chúng được trình bày cho người dùng.
fernandohur

2
đến địa chỉ một số mối quan tâm @fernandohur bạn chỉ có thể tạo ra một lớp view dành riêng cho các ArrayAdapter ... do đó, một lớp mô hình của loại MyClasssẽ yêu cầu bạn thêm một lớp chuyên dụng gọi MyClassViewmà kết thúc tốt đẹp các mô hình cơ bản (và cung cấp toString( )thực hiện
wal

Câu trả lời này là từ năm 2011 và tôi đồng ý với @fernandohur - có nhiều cách xử lý vấn đề này tốt hơn bây giờ.

Tôi nghĩ rằng đây là một câu trả lời tốt bởi vì, trong rất nhiều lần, mỗi lớp có một thuộc tính hơn là đại diện cho tên của đối tượng.
Jhon Fredy Trujillo Ortega

Đây phải là câu trả lời được chấp nhận. Ghi đè một bộ chuyển đổi chỉ để ràng buộc tên in là mã hóa xấu.
L.Grillo

22

Tôi nghĩ rằng đây là cách tiếp cận tốt nhất. Sử dụng lớp ArrayAd CHƯƠNG chung và mở rộng bộ điều hợp đối tượng của riêng bạn đơn giản như sau:

public abstract class GenericArrayAdapter<T> extends ArrayAdapter<T> {

  // Vars
  private LayoutInflater mInflater;

  public GenericArrayAdapter(Context context, ArrayList<T> objects) {
    super(context, 0, objects);
    init(context);
  }

  // Headers
  public abstract void drawText(TextView textView, T object);

  private void init(Context context) {
    this.mInflater = LayoutInflater.from(context);
  }

  @Override public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder vh;
    if (convertView == null) {
      convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
      vh = new ViewHolder(convertView);
      convertView.setTag(vh);
    } else {
      vh = (ViewHolder) convertView.getTag();
    }

    drawText(vh.textView, getItem(position));

    return convertView;
  }

  static class ViewHolder {

    TextView textView;

    private ViewHolder(View rootView) {
      textView = (TextView) rootView.findViewById(android.R.id.text1);
    }
  }
}

và ở đây bộ chuyển đổi của bạn (ví dụ):

public class SizeArrayAdapter extends GenericArrayAdapter<Size> {

  public SizeArrayAdapter(Context context, ArrayList<Size> objects) {
    super(context, objects);
  }

  @Override public void drawText(TextView textView, Size object) {
    textView.setText(object.getName());
  }

}

và cuối cùng, làm thế nào để khởi tạo nó:

ArrayList<Size> sizes = getArguments().getParcelableArrayList(Constants.ARG_PRODUCT_SIZES);
SizeArrayAdapter sizeArrayAdapter = new SizeArrayAdapter(getActivity(), sizes);
listView.setAdapter(sizeArrayAdapter);

Tôi đã tạo Gist với ArrayAd CHƯƠNG tùy chỉnh trọng lực bố cục TextView:

https://gist.github.com/m3n0R/8822804


1
Tôi thực sự thích mã của bạn RẤT NHIỀU, nhưng tôi phải mất một thời gian để tìm hiểu lý do tại sao nó bị sập với android.content.res.Resource $ NotFoundException: Resource ID # 0x0. Bạn có trong lệnh gọi bộ điều hợp chung của mình trên super (.., 0, ..), trong đó 0 thực sự là tài nguyên bố cục, không tồn tại, do đó, nó phải được đổi thành thứ khác .. Ngoài ra, ý chính của bạn là 404
Ev0oD

Cuối cùng, tôi đã thay đổi rất nhiều - bố cục của menu thả xuống khác với cách bố trí của mục được hiển thị, drawText chỉ được gọi trên tiêu đề spinner, không phải trên các mục của nó khi nhấp vào ..
Ev0oD

Điều này nên hợp lệ như bộ chuyển đổi chung. Bạn có thể giải quyết vấn đề?
mổ vào

Vâng, tôi đã làm cho nó hoạt động. Tôi nhận ra rằng bạn cung cấp một giải pháp cho một cái gì đó hơi khác so với những gì tôi muốn, nhưng tôi đã có thể sử dụng mã của bạn làm điểm khởi đầu và sửa đổi theo cách mà nó đã làm cho tôi những gì tôi muốn. Cảm ơn vì đoạn mã này.
Ev0oD

Điều này nên được cung cấp theo mặc định.
Goddard

6

Phân lớp các ArrayAdapter và ghi đè lên các phương pháp getView () để trở về điểm riêng của bạn có chứa các nội dung mà bạn muốn hiển thị.


5

Đây là một ví dụ nhanh và bẩn về cách sử dụng ArrayAd CHƯƠNG nếu bạn không muốn làm phiền bản thân với việc mở rộng lớp mẹ:

class MyClass extends Activity {
    private ArrayAdapter<String> mAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mAdapter = new ArrayAdapter<String>(getApplicationContext(),
            android.R.layout.simple_dropdown_item_1line, android.R.id.text1);

        final ListView list = (ListView) findViewById(R.id.list);
        list.setAdapter(mAdapter);

        //Add Some Items in your list:
        for (int i = 1; i <= 10; i++) {
            mAdapter.add("Item " + i);
        }

        // And if you want selection feedback:
        list.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //Do whatever you want with the selected item
                Log.d(TAG, mAdapter.getItem(position) + " has been selected!");
            }
        });
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.