Để hiểu được mánh khóe, người ta phải biết, bộ điều hợp hoạt động nói chung và ArrayAd CHƯƠNG nói riêng như thế nào.
Bộ điều hợp: là các đối tượng có khả năng liên kết cấu trúc dữ liệu với các widget, sau đó các widget này sẽ hiển thị dữ liệu đó trong Danh sách hoặc trong Spinner.
Vì vậy, hai câu hỏi mà một câu trả lời của Adaptor là:
- Tiện ích hoặc chế độ xem tổng hợp nào cần được liên kết với cấu trúc dữ liệu (đối tượng lớp của bạn) cho một chỉ mục nhất định?
- Làm cách nào để trích xuất dữ liệu từ cấu trúc dữ liệu (đối tượng lớp của bạn) và cách đặt (các) trường tức là
EditText
của tiện ích hoặc chế độ xem tổng hợp theo dữ liệu này?
Câu trả lời của ArrayAd CHƯƠNG là:
- Mỗi tiện ích (tức là
row.xml
OR android.R.layout.simple_spinner_item
) cho bất kỳ chỉ mục nào đều giống nhau và được thổi phồng từ tài nguyên có ID được trao cho hàm tạo của ArrayAd CHƯƠNG.
- Mỗi widget được dự kiến là một phiên bản của TextView (hoặc hậu duệ).
.setText()
Phương thức của widget sẽ được sử dụng với định dạng chuỗi của mục trong cấu trúc dữ liệu hỗ trợ. Định dạng chuỗi sẽ có được bằng cách gọi .toString()
trên mục.
CustomListViewDemo.java
public class CustomListViewDemo extends ListActivity {
private EfficientAdapter adap;
private static String[] data = new String[] { "0", "1", "2", "3", "4" };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
adap = new EfficientAdapter(this);
setListAdapter(adap);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Toast.makeText(this, "Click-" + String.valueOf(position), Toast.LENGTH_SHORT).show();
}
public static class EfficientAdapter extends BaseAdapter implements Filterable {
private LayoutInflater mInflater;
private Bitmap mIcon1;
private Context context;
int firstpos=0;
public EfficientAdapter(Context context) {
// Cache the LayoutInflate to avoid asking for a new one each time.
mInflater = LayoutInflater.from(context);
this.context = context;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.adaptor_content, null);
holder = new ViewHolder();
holder.sp = (Spinner) convertView.findViewById(R.id.spinner1);
holder.ArrayAdapter_sp = new ArrayAdapter(parent.getContext(),android.R.layout.simple_spinner_item,data);
holder.ArrayAdapter_sp.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
holder.sp.setAdapter( holder.ArrayAdapter_sp);
holder.sp.setOnItemSelectedListener(new OnItemSelectedListener()
{
private int pos = position;
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int p, long arg3)
{
// TODO Auto-generated method stub
Toast.makeText(context, "select spinner " + String.valueOf(pos)+" with value ID "+p, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0)
{
// TODO Auto-generated method stub
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
static class ViewHolder
{
Spinner sp;
ArrayAdapter ArrayAdapter_sp;
}
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data[position];
}
}
}
adaptor_content.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lineItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical" >
<Spinner
android:id="@+id/spinner1"
android:layout_width="314dp"
android:layout_height="wrap_content" />
</LinearLayout>
tệp chính
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent" android:layout_width="fill_parent"
>
<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="60dip"
android:layout_marginTop="10dip"
android:cacheColorHint="#00000000"
android:drawSelectorOnTop="false" />
</RelativeLayout>
Nó hoạt động đúng, tôi hy vọng nó hữu ích.