উত্তর:
আসুন আমরা আপনাকে একই ধরণের ভিউ তৈরি করে বলি। আপনি OnClickListener
পৃথকভাবে প্রতিটি দর্শনের জন্য একটি সেট করতে পারেন :
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
তারপরে আপনাকে onClick
প্রতিটি দেখার জন্য একটি অনন্য পদ্ধতি তৈরি করতে হবে এমনকি যদি তারা অনুরূপ কাজ করে তবে:
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
এর কারণ onClick
শুধুমাত্র একটি প্যারামিটার রয়েছে, একটি View
, এবং এটি সুযোগ পরিক্ষেপ মধ্যে উদাহরণস্বরূপ ভেরিয়েবল বা চূড়ান্ত স্থানীয় ভেরিয়েবল থেকে অন্য তথ্য পেতে হয়েছে। আমরা যা চাই তা হ'ল নিজের মতামত থেকে তথ্য নেওয়া ।
লিখুন getTag
/ setTag
:
button1.setTag(1);
button2.setTag(2);
এখন আমরা প্রতিটি বোতামের জন্য একই অনক্লিকলিস্টনার ব্যবহার করতে পারি:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
এটি দেখার জন্য স্মৃতি ধারণের মূলত একটি উপায় ।
public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }
রঙ অংশের জন্য কৌশলটি করা উচিত। 20 আপনার দেখার বৈধতা পজিশনের জন্য কেবল স্থানধারক।
আমি কয়েকটি শব্দ যুক্ত করতে চাই।
যদিও ব্যবহার get/setTag(Object)
একটি ViewHolder প্যাটার্ন নির্দিষ্ট ক্ষেত্রে খুব দরকারী হবে বলে মনে হয়, আমি অন্যান্য ক্ষেত্রে এটি ব্যবহার করার পূর্বে আরেকবার ভেবে কথা বলতে চাই। আরও প্রায়শই আরও ভাল ডিজাইন সহ আরও একটি সমাধান রয়েছে।
মূল কারণটি হল যে এর মতো কোডটি খুব দ্রুতই অসমর্থিত হয়ে যায়।
আপনি ভিউ হিসাবে ট্যাগ হিসাবে সঞ্চয় করার জন্য যা নকশা করেছেন তা অন্য বিকাশকারীদের পক্ষে এটি স্পষ্ট নয়। পদ্ধতিগুলি setTag/getTag
মোটেই বর্ণনামূলক নয়।
এটি কেবলমাত্র একটি সঞ্চয় করে Object
, যা আপনি যখন চান তখন কাস্ট করা প্রয়োজন getTag
। আপনি ট্যাগে সঞ্চিত বস্তুর ধরণের পরিবর্তন করার সিদ্ধান্ত নেওয়ার পরে আপনি অপ্রত্যাশিত ক্র্যাশ পেতে পারেন।
এখানে একটি বাস্তব জীবনের গল্প: আমাদের কাছে অনেকগুলি অ্যাডাপ্টার, ভিউ সহ অ্যাসিঙ্ক অপারেশন সহ একটি দুর্দান্ত একটি প্রকল্প ছিল। একজন বিকাশকারী set/getTag
তার কোডের অংশে সিদ্ধান্ত নিয়েছেন , কিন্তু অন্য একজন ইতিমধ্যে ট্যাগটি এই ভিউতে সেট করেছেন। শেষ অবধি, কেউ নিজের ট্যাগ খুঁজে না পেয়ে খুব বিভ্রান্ত হয়ে পড়েছিল। বাগটি খুঁজে পেতে আমাদের বেশ কয়েক ঘন্টা ব্যয় করেছে।
setTag(int key, Object tag)
আরও ভাল দেখাচ্ছে, কারণ আপনি প্রতিটি ট্যাগের জন্য অনন্য কী উত্পন্ন করতে পারবেন ( আইডি সংস্থান ব্যবহার করে ) তবে অ্যান্ড্রয়েড <4.0 এর জন্য উল্লেখযোগ্য বাধা রয়েছে। লিন্ট ডক্স থেকে:
অ্যান্ড্রয়েড 4.0.০ এর আগে ভিউ.সেটট্যাগ (ইনট, অবজেক্ট) বাস্তবায়ন বস্তুগুলিকে একটি স্ট্যাটিক মানচিত্রে সংরক্ষণ করবে, যেখানে মানগুলি দৃ strongly়ভাবে উল্লেখ করা হয়েছিল। এর অর্থ হ'ল যদি অবজেক্টটিতে প্রসঙ্গটি নির্দেশ করে কোনও রেফারেন্স থাকে তবে কনটেক্সট (যা বেশ কিছু কিছুকে নির্দেশ করে) ফাঁস হয়ে যাবে। আপনি যদি কোনও ভিউ পাস করেন, দৃশ্যটি এটি তৈরি করা প্রসঙ্গে একটি রেফারেন্স সরবরাহ করে। একইভাবে, ভিউ হোল্ডারগুলিতে সাধারণত একটি ভিউ থাকে এবং কার্সারগুলি কখনও কখনও ভিউগুলির সাথেও যুক্ত থাকে।
আমরা ব্যবহার করতে পারি setTag()
এবং getTag()
সেট এবং আমাদের প্রতি প্রয়োজন হিসাবে কাস্টম বস্তু পেতে। setTag()
পদ্ধতি ধরনের একটি আর্গুমেন্ট লাগে Object
, এবং getTag()
একটি ফেরৎ Object
।
উদাহরণ স্বরূপ,
Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);
এটি কাস্টম ArrayAdapter
ব্যবহারের জন্য খুব দরকারী । এটি একরকম অপটিমাইজেশন। সেখানে setTag
বস্তু রেফারেন্স হিসেবে ব্যবহৃত বিন্যাস কিছু অংশে উল্লেখের (প্রদর্শন যে ListView
পরিবর্তে) findViewById
।
static class ViewHolder {
TextView tvPost;
TextView tvDate;
ImageView thumb;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = myContext.getLayoutInflater();
convertView = inflater.inflate(R.layout.postitem, null);
ViewHolder vh = new ViewHolder();
vh.tvPost = (TextView)convertView.findViewById(R.id.postTitleLabel);
vh.tvDate = (TextView)convertView.findViewById(R.id.postDateLabel);
vh.thumb = (ImageView)convertView.findViewById(R.id.postThumb);
convertView.setTag(vh);
}
....................
}
আইডিগুলির বিপরীতে, ট্যাগগুলি দর্শন সনাক্ত করতে ব্যবহৃত হয় না। ট্যাগগুলি মূলত তথ্যের একটি অতিরিক্ত অংশ যা কোনও দৃশ্যের সাথে সম্পর্কিত হতে পারে। এগুলি প্রায়শই পৃথক কাঠামোয় রাখার পরিবর্তে ভিউগুলিতে সম্পর্কিত সম্পর্কিত ডেটা সংরক্ষণের সুবিধার্থে ব্যবহৃত হয়।
তথ্যসূত্র: http://developer.android.com/references/android/view/View.html
আপনার তালিকার ভিউ থাকাকালীন এবং ভিউগুলিকে পুনর্ব্যক্ত / পুনঃব্যবহার করতে চাইলে ট্যাগগুলি সেট করা সত্যই কার্যকর। সেভাবে তালিকাগুলিটি নতুন পুনর্ব্যক্তিকল্পের সাথে খুব মিলছে।
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
if ( convertView == null )
{
/* There is no view at this position, we create a new one.
In this case by inflating an xml layout */
convertView = mInflater.inflate(R.layout.listview_item, null);
holder = new ViewHolder();
holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
convertView.setTag (holder);
}
else
{
/* We recycle a View that already exists */
holder = (ViewHolder) convertView.getTag ();
}
// Once we have a reference to the View we are returning, we set its values.
// Here is where you should set the ToggleButton value for this item!!!
holder.toggleOk.setChecked( mToggles.get( position ) );
return convertView;
}