অ্যারেএডাপ্টার <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);

ক্লাস: মাইক্লাস

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

আমি লেআউটগুলিতে সারি.এক্সএমএল তৈরি করেছি, তবে অ্যারেএডাপ্টার ব্যবহার করে তালিকাভিউতে যুক্তি এবং লং_ভাল উভয়ই কীভাবে প্রদর্শন করতে হয় তা আমি জানি না।

উত্তর:


155

আপনার শ্রেণীর জন্য কাস্টম অ্যাডাপ্টার প্রয়োগ করুন:

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;
    }
}

অ্যান্ড্রয়েড কাঠামোর সাথে খুব বেশি পরিচিত না তাদের জন্য, এখানে আরও বিস্তারিতভাবে এটি ব্যাখ্যা করা হয়েছে: https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView


2
দুঃখিত, মাইক্লাস আইটেম = আইটেম.জেট (অবস্থান) ত্রুটিটি সমাধান করে, আমার দ্বারা ভেরিয়েবলগুলি মেলে না।
সুমিত এম আসক

1
আমি উপরের কোড থেকে আইটেম ক্ষেত্রটি সরিয়ে ফেলেছি, কারণ এটি সহজেই ত্রুটির দিকে পরিচালিত করতে পারে - উদাহরণস্বরূপ যদি কেউ
অ্যাডাপ্টারক্লায়ার

1
আমি কি ধরে নিচ্ছি যে textViewResourceIdউপরে ব্যবহার করা হয়নি?
জেরিটান

8
ভিউহোল্ডার কোথা থেকে এসেছে?
গেরি

2
আর.লেআউটআউটলিস্টভিউ_সোসিয়েশন কী? এটা কি আপনার কাস্টম বিন্যাস? আমি কি এটিকে android.R.layout.simple_list_item_1 দিয়ে প্রতিস্থাপন করতে পারি?
দোনাতো

76

আপনি কেবল http://developer.android.com/references/android/widget/ArrayAdapter.htmltoString() প্রতি মাইক্লাসে একটি পদ্ধতি যুক্ত করতে পারেন :

তবে টেক্সটভিউ রেফারেন্সযুক্ত, এটি অ্যারের প্রতিটি বস্তুর টোস্ট্রিং () দিয়ে পূর্ণ হবে। আপনি কাস্টম অবজেক্টের তালিকা বা অ্যারে যোগ করতে পারেন। তালিকার আইটেমটির জন্য কী পাঠ্য প্রদর্শিত হবে তা নির্ধারণ করতে আপনার অবজেক্টের টসস্ট্রিং () পদ্ধতিটি ওভাররাইড করুন।

class MyClass {

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

20
যদিও সহজ সমাধান, এটি (আইএমএইচও) খুব ভাল ধারণা নয়। তিনটি কারণ: আপনার যদি কখনও স্থানীয়করণের প্রয়োজন হয়, আপনাকে রিফ্যাক্টর করতে হবে। এটি কেবলমাত্র যদি আপনার 1 টি অ্যাডাপ্টার থাকে তবে কাজ করে, আপনার যদি 2 টি পৃথক অ্যাডাপ্টার MyClassথাকে তবে আপনাকে রিফ্যাক্টর করতে হবে। অবশেষে, আপনার মডেলগুলিতে উপস্থাপনা যুক্তি যুক্ত করার পক্ষে এটি একটি খারাপ ধারণা। মডেলগুলি কীভাবে তারা ব্যবহারকারীর কাছে উপস্থাপিত হয় সে সম্পর্কে সচেতন হওয়া উচিত নয়।
ফার্নান্দহুর

2
@ ফার্নান্দোহুর উদ্বেগের কয়েকটি সমাধান করার জন্য আপনি কেবল অ্যারেএডাপ্টারের জন্য একটি উত্সর্গীকৃত ভিউ ক্লাস তৈরি করতে পারেন ... সুতরাং ধরণের মডেল শ্রেণির জন্য MyClassআপনাকে একটি উত্সর্গীকৃত শ্রেণি যুক্ত করতে হবে MyClassViewযা অন্তর্নিহিত মডেলটিকে আবৃত করে (এবং toString( )বাস্তবায়ন সরবরাহ করে
ওয়াল

এই উত্তরটি ছিল ২০১১ সালের, এবং আমি @ ফার্নান্দোহুরের সাথে একমত - এখন এটি পরিচালনা করার আরও ভাল উপায় রয়েছে।

আমি মনে করি এটি একটি ভাল উত্তর কারণ অনেক সময় প্রতিটি শ্রেণীর অবজেক্টের নাম উপস্থাপন করার চেয়ে একটি অ্যাট্রিবিউট থাকে।
ঝন ফ্রেডি ট্রুজিলো অরতেগা

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। কোনও মুদ্রিত নাম বাঁধার জন্য অ্যাডাপ্টারকে ওভাররাইড করা খারাপ কোডিং।
এল.গ্রিলো

22

আমি মনে করি এটি সর্বোত্তম পন্থা। জেনেরিক অ্যারেএডাপ্টার ক্লাস ব্যবহার করা এবং আপনার নিজের অবজেক্ট অ্যাডাপ্টারটি প্রসারিত নীচের মত সহজ:

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);
    }
  }
}

এবং এখানে আপনার অ্যাডাপ্টার (উদাহরণস্বরূপ):

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());
  }

}

এবং পরিশেষে, কীভাবে এটি সূচনা করবেন:

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

আমি টেক্সটভিউ লেআউটের মাধ্যাকর্ষণ কাস্টমাইজযোগ্য অ্যারেএডাপ্টার সহ একটি গিস্ট তৈরি করেছি:

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


1
আমি আপনার কোডটি সত্যিই প্রচুর পছন্দ করেছি তবে এন্ড্রয়েড.কন্টেন্ট.রেস.সংশ্লিষ্ট $ নটফাউন্ডএক্সেপশন: রিসোর্স আইডি # 0x0- এর সাথে ক্র্যাশ হচ্ছে কেন তা জানতে আমার কিছুটা সময় লেগেছে। আপনার জেনেরিক অ্যাডাপ্টারের কলটিতে সুপার (.., 0, ..) রয়েছে, যেখানে 0 আসলে একটি লেআউট রিসোর্স, যা বিদ্যমান নেই, তাই এটি অন্য কিছুতে পরিবর্তন করা আবশ্যক .. এছাড়াও, আপনার
গিস্টটি

শেষ পর্যন্ত আমি অনেকগুলি পরিবর্তন করে শেষ করেছি - ড্রপডাউন মেনুটির বিন্যাস দেখানো আইটেমের বিন্যাসের চেয়ে আলাদা ছিল, ড্র টেক্সট কেবল স্পিনার শিরোনামে কল হয়েছিল, তার আইটেমগুলিতে ক্লিক করা হয়নি ..
Ev0oD

এটি জেনেরিক অ্যাডাপ্টার হিসাবে বৈধ হওয়া উচিত। আপনি কি সমস্যার সমাধান করতে পারবেন?
সিজার্ড

হ্যাঁ, আমি এটি কাজ করেছিলাম। আমি বুঝতে পেরেছিলাম যে আপনি যা চেয়েছিলেন তার চেয়ে একটু আলাদা করার জন্য আপনি একটি সমাধান সরবরাহ করেছেন তবে আমি আপনার কোডটি একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করতে এবং এমনভাবে সংশোধন করতে সক্ষম হয়েছি যাতে এটি আমার যা করতে চায় তা করে। কোড এই টুকরা জন্য ধন্যবাদ।
Ev0oD

এটি ডিফল্টরূপে সরবরাহ করা উচিত।
গড্ডার্ড

6

অ্যারেএডাপ্টারটি সাবক্লাস করুন এবং আপনার প্রদর্শিত দৃষ্টিভঙ্গিটিতে যে প্রদর্শনটি প্রদর্শন করতে চান সেগুলি ফেরত পেতে getView () পদ্ধতিটি ওভাররাইড করুন ।


5

আপনি যদি মাদার ক্লাস বাড়ানোর বিষয়ে নিজেকে বিরক্ত করতে না চান তবে অ্যারেএডাপ্টার কীভাবে ব্যবহার করবেন তার একটি দ্রুত এবং নোংরা উদাহরণ এখানে:

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!");
            }
        });
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.