चाल को समझने के लिए, किसी को यह जानना होगा कि विशेष रूप से एडेप्टर कैसे काम करते हैं और विशेष रूप से ArrayAdapter।
एडेप्टर: वे ऑब्जेक्ट हैं जो डेटा संरचनाओं को विगेट्स से बाँधने में सक्षम हैं, फिर ये विजेट उस डेटा को सूची में या स्पिनर में प्रदर्शित कर रहे हैं।
तो दो सवाल एक एडाप्टर जवाब हैं:
- एक निश्चित सूचकांक के लिए कौन से विजेट या समग्र दृश्य को डेटा संरचना (आपकी कक्षा की वस्तु) के साथ जोड़ा जाना चाहिए?
- डेटा संरचना (आपकी कक्षा की वस्तु) से डेटा कैसे निकाला जाए और
EditText
इस डेटा के अनुसार फ़ील्ड (एस) विजेट या समग्र दृश्य कैसे सेट करें?
ArrayAdapter के उत्तर हैं:
- प्रत्येक विजेट (यानी
row.xml
या android.R.layout.simple_spinner_item
) किसी भी सूचकांक के लिए एक ही है, और संसाधन जिसकी आईडी ArrayAdapter के निर्माता को दिया गया था से फुलाया जाता है।
- प्रत्येक विजेट को TextView (या वंशज) का एक उदाहरण होने की उम्मीद है। विजेट का
.setText()
तरीका सहायक डेटा संरचना में आइटम के स्ट्रिंग प्रारूप के साथ उपयोग किया जाएगा। स्ट्रिंग प्रारूप को .toString()
आइटम पर लागू करके प्राप्त किया जाएगा ।
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>
main.xml
<?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>
यह ठीक से काम करता है, मुझे आशा है कि यह उपयोगी है।