আইওএসের ইউআইটিএবলভিউয়ের অনুরূপ সারি / বিভাগ যুক্তি পরিচালনা করা অ্যান্ড্রয়েডে আইওএসের মতো সহজ নয়, তবে, আপনি যখন রিসাইক্লারভিউ ব্যবহার করেন - আপনি যা করতে পারেন তার নমনীয়তা অনেক বেশি।
শেষ অবধি, অ্যাডাপ্টারে আপনি কী ধরণের দৃশ্য প্রদর্শন করছেন তা আপনি কীভাবে নির্ধারণ করবেন সে সম্পর্কে এটিই সমস্ত। একবার আপনি এটি সন্ধান পেয়ে গেলে, সহজেই নৌযান হওয়া উচিত (আসলে নয়, তবে কমপক্ষে আপনার এটি বাছাই করা হবে)।
অ্যাডাপ্টার দুটি পদ্ধতি প্রকাশ করে যা আপনার ওভাররাইড করা উচিত:
getItemViewType(int position)
এই পদ্ধতির ডিফল্ট প্রয়োগটি সর্বদা 0 ফিরে আসবে, ইঙ্গিত করে যে এখানে কেবল 1 ধরণের দর্শন রয়েছে। আপনার ক্ষেত্রে, এটি তেমন নয় এবং তাই আপনার সারিটি কোন ভিউয়ের সাথে সাদৃশ্যপূর্ণ তা জোর দেওয়ার একটি উপায় খুঁজে বের করতে হবে। আইওএসের বিপরীতে, যা সারি এবং বিভাগগুলি আপনার জন্য এটি পরিচালনা করে, এখানে নির্ভর করার জন্য আপনার কাছে কেবলমাত্র একটি সূচক থাকবে এবং কোনও অবস্থান কোনও বিভাগের শিরোনামের সাথে সংযোগ স্থাপন করে এবং কখন এটির সাথে সংযোগ স্থাপন করে তা জানতে আপনার বিকাশকারী দক্ষতা ব্যবহার করতে হবে you'll একটি সাধারণ সারি
createViewHolder(ViewGroup parent, int viewType)
আপনার যেকোন উপায়ে এই পদ্ধতিটি ওভাররাইড করা দরকার, তবে সাধারণত লোকেরা কেবল ভিউটাইপ পরামিতি উপেক্ষা করে। দর্শন প্রকার অনুসারে, আপনাকে সঠিক লেআউট রিসোর্স স্ফীত করতে হবে এবং সেই অনুযায়ী আপনার ভিউ ধারক তৈরি করতে হবে। রিসাইক্লারভিউ বিভিন্ন উপত্যকার ধরণের পুনর্ব্যবহার করে এমনভাবে পরিচালনা করবে যা বিভিন্ন দর্শন প্রকারের সংঘাতকে এড়িয়ে চলে।
যদি আপনি কোনও ডিফল্ট লেআউটম্যানেজার যেমন ব্যবহার করার পরিকল্পনা করে থাকেন তবে আপনার LinearLayoutManager
ভাল হওয়া উচিত। আপনি যদি নিজের লেআউট ম্যানেজার বাস্তবায়ন করার পরিকল্পনা করে থাকেন তবে আপনাকে আরও কঠোর পরিশ্রম করতে হবে। আপনার সত্যিকারের সাথে কাজ করতে হবে এমন একমাত্র এপিআই হ'ল findViewByPosition(int position)
যা নির্দিষ্ট অবস্থানে প্রদত্ত ভিউ দেয়। যেহেতু আপনি সম্ভবত এই ভিউটি কী ধরণের নির্ভর করে এটি আলাদাভাবে ছড়িয়ে দিতে চান তাই আপনার কাছে কয়েকটি বিকল্প রয়েছে:
সাধারণত ভিউহোল্ডার প্যাটার্নটি ব্যবহার করার সময় আপনি ভিউ হোল্ডারের সাথে ভিউ ট্যাগটি সেট করেন। আপনি লেআউট ম্যানেজারটিতে রানটাইম চলাকালীন সময়ে ভিউ ধারক যা এটি প্রকাশ করে তাতে কোনও ক্ষেত্র যুক্ত করে দর্শন কী ধরণের তা জানতে এটি ব্যবহার করতে পারেন।
যেহেতু আপনার কোনও ফাংশন প্রয়োজন যা কোনও অবস্থানের সাথে কোন অবস্থানের সাথে সম্পর্কিত কিনা তা নির্ধারণ করে, আপনি পাশাপাশি এই পদ্ধতিটি কোনওভাবে বিশ্বব্যাপী অ্যাক্সেসযোগ্য করে তুলতে পারেন (সম্ভবত কোনও সিঙ্গলটন শ্রেণি যা ডেটা পরিচালনা করে?) এবং তারপরে আপনি কেবল সেই পদ্ধতি অনুসারে প্রশ্নটি করতে পারেন অবস্থান।
এখানে একটি কোড নমুনা:
// in this sample, I use an object array to simulate the data of the list.
// I assume that if the object is a String, it means I should display a header with a basic title.
// If not, I assume it's a custom model object I created which I will use to bind my normal rows.
private Object[] myData;
public static final int ITEM_TYPE_NORMAL = 0;
public static final int ITEM_TYPE_HEADER = 1;
public class MyAdapter extends Adapter<ViewHolder> {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE_NORMAL) {
View normalView = LayoutInflater.from(getContext()).inflate(R.layout.my_normal_row, null);
return new MyNormalViewHolder(normalView); // view holder for normal items
} else if (viewType == ITEM_TYPE_HEADER) {
View headerRow = LayoutInflater.from(getContext()).inflate(R.layout.my_header_row, null);
return new MyHeaderViewHolder(headerRow); // view holder for header items
}
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final int itemType = getItemViewType(position);
if (itemType == ITEM_TYPE_NORMAL) {
((MyNormalViewHolder)holder).bindData((MyModel)myData[position]);
} else if (itemType == ITEM_TYPE_HEADER) {
((MyHeaderViewHolder)holder).setHeaderText((String)myData[position]);
}
}
@Override
public int getItemViewType(int position) {
if (myData[position] instanceof String) {
return ITEM_TYPE_HEADER;
} else {
return ITEM_TYPE_NORMAL;
}
}
@Override
public int getItemCount() {
return myData.length;
}
}
এই দর্শকদের কীভাবে দেখা উচিত তার একটি নমুনা এখানে দেওয়া হল:
public MyHeaderViewHolder extends ViewHolder {
private TextView headerLabel;
public MyHeaderViewHolder(View view) {
super(view);
headerLabel = (TextView)view.findViewById(R.id.headerLabel);
}
public void setHeaderText(String text) {
headerLabel.setText(text);
}
}
public MyNormalViewHolder extends ViewHolder {
private TextView titleLabel;
private TextView descriptionLabel;
public MyNormalViewHolder(View view) {
super(view);
titleLabel = (TextView)view.findViewById(R.id.titleLabel);
descriptionLabel = (TextView)view.findViewById(R.id.descriptionLabel);
}
public void bindData(MyModel model) {
titleLabel.setText(model.getTitle());
descriptionLabel.setText(model.getDescription());
}
}
অবশ্যই, এই নমুনাটি ধরে নিয়েছে আপনি আপনার ডেটা উত্স (মাইডাটা) এমনভাবে তৈরি করেছেন যা কোনও অ্যাডাপ্টারকে এভাবে প্রয়োগ করা সহজ করে তোলে। উদাহরণস্বরূপ, আমি আপনাকে দেখাব যে কীভাবে আমি একটি ডেটা উত্স তৈরি করব যা নামের তালিকা প্রদর্শন করে এবং প্রত্যেকবার নামের প্রথম শিরোনামটি পরিবর্তিত হয় (তালিকাটি বর্ণানুক্রমিক বলে ধরে নেওয়া হয়) - কীভাবে পরিচিতিগুলির অনুরূপ তালিকা দেখতে হবে:
// Assume names & descriptions are non-null and have the same length.
// Assume names are alphabetized
private void processDataSource(String[] names, String[] descriptions) {
String nextFirstLetter = "";
String currentFirstLetter;
List<Object> data = new ArrayList<Object>();
for (int i = 0; i < names.length; i++) {
currentFirstLetter = names[i].substring(0, 1); // get the 1st letter of the name
// if the first letter of this name is different from the last one, add a header row
if (!currentFirstLetter.equals(nextFirstLetter)) {
nextFirstLetter = currentFirstLetter;
data.add(nextFirstLetter);
}
data.add(new MyModel(names[i], descriptions[i]));
}
myData = data.toArray();
}
এই উদাহরণটি মোটামুটি সুনির্দিষ্ট সমস্যার সমাধান করতে আসে তবে আমি আশা করি এটি আপনাকে পুনর্ব্যবহারকারীটিতে বিভিন্ন সারি ধরণের হ্যান্ডেল করার জন্য একটি ভাল ওভারভিউ দেয় এবং আপনার প্রয়োজনীয়তার সাথে খাপ খাইয়ে দেওয়ার জন্য আপনাকে নিজের কোডে প্রয়োজনীয় অভিযোজন করতে দেয়।