Adaptateur personnalisé pour la liste

Je veux créer un custom adapter pour ma vue liste. Y a-t-il un article qui peut me guider à travers comment créer un article et expliquer comment cela fonctionne?

 public class ListAdapter extends ArrayAdapter { public ListAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } public ListAdapter(Context context, int resource, List items) { super(context, resource, items); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi; vi = LayoutInflater.from(getContext()); v = vi.inflate(R.layout.itemlistrow, null); } Item p = getItem(position); if (p != null) { TextView tt1 = (TextView) v.findViewById(R.id.id); TextView tt2 = (TextView) v.findViewById(R.id.categoryId); TextView tt3 = (TextView) v.findViewById(R.id.description); if (tt1 != null) { tt1.setText(p.getId()); } if (tt2 != null) { tt2.setText(p.getCategory().getId()); } if (tt3 != null) { tt3.setText(p.getDescription()); } } return v; } } 

C’est une classe que j’avais utilisée pour mon projet. Vous devez avoir une collection de vos éléments que vous voulez afficher, dans mon cas, c’est . Vous devez remplacer la View getView(int position, View convertView, ViewGroup parent) .

R.layout.itemlistrow définit la ligne de ListView .

           

Dans MainActivity définissez ListView comme ceci,

 ListView yourListView = (ListView) findViewById(R.id.itemListView); // get data from the table by the ListAdapter ListAdapter customAdapter = new ListAdapter(this, R.layout.itemlistrow, List); yourListView .setAdapter(customAdapter); 

Je sais que cela a déjà été répondu … mais je voulais donner un exemple plus complet.

Dans mon exemple, ListActivity qui affichera notre ListView personnalisé s’appelle OptionsActivity , car dans mon projet, cette Activity va afficher les différentes options que mon utilisateur peut définir pour contrôler mon application. Il y a deux types d’éléments de liste, un type d’élément de liste a juste un TextView et le deuxième type d’élément de liste a juste un Button . Vous pouvez placer tous les widgets que vous aimez dans chaque type d’élément de liste, mais j’ai gardé cet exemple simple.

La méthode getItemView() vérifie quels éléments de la liste doivent être de type 1 ou de type 2. Selon les ints statiques que j’ai définis, les 5 premiers éléments de la liste seront du type d’élément de liste 1 et les 5 derniers éléments de la liste. type d’élément 2. Donc, si vous comstackz et exécutez ceci, vous aurez un ListView qui a cinq éléments qui contiennent juste un Button , et ensuite cinq éléments qui contiennent juste un TextView .

Vous trouverez ci-dessous le code d’ Activity , le fichier xml d’activité et un fichier xml pour chaque type d’élément de liste.

OptionsActivity.java:

 public class OptionsActivity extends ListActivity { private static final int LIST_ITEM_TYPE_1 = 0; private static final int LIST_ITEM_TYPE_2 = 1; private static final int LIST_ITEM_TYPE_COUNT = 2; private static final int LIST_ITEM_COUNT = 10; // The first five list items will be list item type 1 // and the last five will be list item type 2 private static final int LIST_ITEM_TYPE_1_COUNT = 5; private MyCustomAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAdapter = new MyCustomAdapter(); for (int i = 0; i < LIST_ITEM_COUNT; i++) { if (i < LIST_ITEM_TYPE_1_COUNT) mAdapter.addItem("item type 1"); else mAdapter.addItem("item type 2"); } setListAdapter(mAdapter); } private class MyCustomAdapter extends BaseAdapter { private ArrayList mData = new ArrayList(); private LayoutInflater mInflater; public MyCustomAdapter() { mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public void addItem(final Ssortingng item) { mData.add(item); notifyDataSetChanged(); } @Override public int getItemViewType(int position) { if(position < LIST_ITEM_TYPE_1_COUNT) return LIST_ITEM_TYPE_1; else return LIST_ITEM_TYPE_2; } @Override public int getViewTypeCount() { return LIST_ITEM_TYPE_COUNT; } @Override public int getCount() { return mData.size(); } @Override public String getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; int type = getItemViewType(position); if (convertView == null) { holder = new ViewHolder(); switch(type) { case LIST_ITEM_TYPE_1: convertView = mInflater.inflate(R.layout.list_item_type1, null); holder.textView = (TextView)convertView.findViewById(R.id.list_item_type1_text_view); break; case LIST_ITEM_TYPE_2: convertView = mInflater.inflate(R.layout.list_item_type2, null); holder.textView = (TextView)convertView.findViewById(R.id.list_item_type2_button); break; } convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } holder.textView.setText(mData.get(position)); return convertView; } } public static class ViewHolder { public TextView textView; } } 

activity_options.xml:

     

list_item_type_1.xml:

     

list_item_type2.xml:

     

Ce code est facile à comprendre.

three_horizontal_text_views_layout.xml

       

ThreeSsortingngs.java

 public class ThreeSsortingngs { private Ssortingng left; private Ssortingng right; private Ssortingng centre; public ThreeSsortingngs(Ssortingng left, Ssortingng right, Ssortingng centre) { this.left = left; this.right = right; this.centre = centre; } } 

ThreeHorizontalTextViewsAdapter.java

 public class ThreeHorizontalTextViewsAdapter extends ArrayAdapter { private int layoutResource; public ThreeHorizontalTextViewsAdapter(Context context, int layoutResource, List threeSsortingngsList) { super(context, layoutResource, threeSsortingngsList); this.layoutResource = layoutResource; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { LayoutInflater layoutInflater = LayoutInflater.from(getContext()); view = layoutInflater.inflate(layoutResource, null); } ThreeSsortingngs threeSsortingngs = getItem(position); if (threeSsortingngs != null) { TextView leftTextView = (TextView) view.findViewById(R.id.leftTextView); TextView rightTextView = (TextView) view.findViewById(R.id.rightTextView); TextView centreTextView = (TextView) view.findViewById(R.id.centreTextView); if (leftTextView != null) { leftTextView.setText(threeSsortingngs.getLeft()); } if (rightTextView != null) { rightTextView.setText(threeSsortingngs.getRight()); } if (centreTextView != null) { centreTextView.setText(threeSsortingngs.getCentre()); } } return view; } } 

main_layout.xml

    

MainActivity.java

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List threeSsortingngsList = new ArrayList<>(); ThreeStrings threeStrings = new ThreeStrings("a", "b", "c"); threeStringsList.add(threeStrings); ListView listView = (ListView)findViewById(R.id.listView); ThreeHorizontalTextViewsAdapter threeHorizontalTextViewsAdapter = new ThreeHorizontalTextViewsAdapter(this, R.layout.three_horizontal_text_views_layout, threeStringsList); listView.setAdapter(threeHorizontalTextViewsAdapter); } //......} 

Google a un exemple appelé EfficientAdapter, qui à mon avis est le meilleur exemple simple de la mise en œuvre des adaptateurs personnalisés. http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html @CommonsWare a écrit une bonne explication des modèles utilisés dans l’exemple ci-dessus http: // commonsware.com/Android/excerpt.pdf

Vous pouvez consulter cet exemple dans ApiDemos officiel. Il montre comment étendre BaseAdapter et l’appliquer à un ListView . Après cela, regardez simplement la référence pour BaseAdapter et essayez de comprendre ce que fait chaque méthode (y compris les méthodes héritées) et quand / comment l’utiliser.

En outre, Google est votre ami :).

vérifiez ce lien , très simplement via convertView , nous pouvons obtenir la disposition d’une ligne qui sera affichée dans listview (qui est le parentView ).

 View v = convertView; if (v == null) { LayoutInflater vi; vi = LayoutInflater.from(getContext()); v = vi.inflate(R.layout.itemlistrow, null); } 

en utilisant la position, vous pouvez obtenir les objects de la List .

 Item p = items.get(position); 

Après cela, nous devrons définir les détails souhaités de l’object sur les widgets de formulaire identifiés.

 if (p != null) { TextView tt = (TextView) v.findViewById(R.id.id); TextView tt1 = (TextView) v.findViewById(R.id.categoryId); TextView tt3 = (TextView) v.findViewById(R.id.description); if (tt != null) { tt.setText(p.getId()); } if (tt1 != null) { tt1.setText(p.getCategory().getId()); } if (tt3 != null) { tt3.setText(p.getDescription()); } } 

alors il retournera la vue construite qui sera attachée au parentView (qui est un ListView / GridView ).

Voici la marche à suivre pour créer un adaptateur personnalisé pour l’affichage de la liste étape par étape –

https://www.caveofprogramming.com/guest-posts/custom-listview-with-imageview-and-textview-in-android.html

 public class CustomAdapter extends BaseAdapter{ Ssortingng [] result; Context context; int [] imageId; private static LayoutInflater inflater=null; public CustomAdapter(MainActivity mainActivity, Ssortingng[] prgmNameList, int[] prgmImages) { // TODO Auto-generated constructor stub result=prgmNameList; context=mainActivity; imageId=prgmImages; inflater = ( LayoutInflater )context. getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return result.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } public class Holder { TextView tv; ImageView img; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Holder holder=new Holder(); View rowView; rowView = inflater.inflate(R.layout.program_list, null); holder.tv=(TextView) rowView.findViewById(R.id.textView1); holder.img=(ImageView) rowView.findViewById(R.id.imageView1); holder.tv.setText(result[position]); holder.img.setImageResource(imageId[position]); rowView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(context, "You Clicked "+result[position], Toast.LENGTH_LONG).show(); } }); return rowView; } } 

Modèle de données

 public class DataModel { Ssortingng name; Ssortingng type; Ssortingng version_number; Ssortingng feature; public DataModel(Ssortingng name, Ssortingng type, Ssortingng version_number, Ssortingng feature ) { this.name=name; this.type=type; this.version_number=version_number; this.feature=feature; } public Ssortingng getName() { return name; } public Ssortingng getType() { return type; } public Ssortingng getVersion_number() { return version_number; } public Ssortingng getFeature() { return feature; } } 

Adaptateur de tableau

 public class CustomAdapter extends ArrayAdapter implements View.OnClickListener{ private ArrayList dataSet; Context mContext; // View lookup cache private static class ViewHolder { TextView txtName; TextView txtType; TextView txtVersion; ImageView info; } public CustomAdapter(ArrayList data, Context context) { super(context, R.layout.row_item, data); this.dataSet = data; this.mContext=context; } @Override public void onClick(View v) { int position=(Integer) v.getTag(); Object object= getItem(position); DataModel dataModel=(DataModel)object; switch (v.getId()) { case R.id.item_info: Snackbar.make(v, "Release date " +dataModel.getFeature(), Snackbar.LENGTH_LONG) .setAction("No action", null).show(); break; } } private int lastPosition = -1; @Override public View getView(int position, View convertView, ViewGroup parent) { // Get the data item for this position DataModel dataModel = getItem(position); // Check if an existing view is being reused, otherwise inflate the view ViewHolder viewHolder; // view lookup cache stored in tag final View result; if (convertView == null) { viewHolder = new ViewHolder(); LayoutInflater inflater = LayoutInflater.from(getContext()); convertView = inflater.inflate(R.layout.row_item, parent, null); viewHolder.txtName = (TextView) convertView.findViewById(R.id.name); viewHolder.txtType = (TextView) convertView.findViewById(R.id.type); viewHolder.txtVersion = (TextView) convertView.findViewById(R.id.version_number); viewHolder.info = (ImageView) convertView.findViewById(R.id.item_info); result=convertView; convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); result=convertView; } Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top); result.startAnimation(animation); lastPosition = position; viewHolder.txtName.setText(dataModel.getName()); viewHolder.txtType.setText(dataModel.getType()); viewHolder.txtVersion.setText(dataModel.getVersion_number()); viewHolder.info.setOnClickListener(this); viewHolder.info.setTag(position); // Return the completed view to render on screen return convertView; } } 

Activité principale

 public class MainActivity extends AppCompatActivity { ArrayList dataModels; ListView listView; private static CustomAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); listView=(ListView)findViewById(R.id.list); dataModels= new ArrayList<>(); dataModels.add(new DataModel("Apple Pie", "Android 1.0", "1","September 23, 2008")); dataModels.add(new DataModel("Banana Bread", "Android 1.1", "2","February 9, 2009")); dataModels.add(new DataModel("Cupcake", "Android 1.5", "3","April 27, 2009")); dataModels.add(new DataModel("Donut","Android 1.6","4","September 15, 2009")); dataModels.add(new DataModel("Eclair", "Android 2.0", "5","October 26, 2009")); dataModels.add(new DataModel("Froyo", "Android 2.2", "8","May 20, 2010")); dataModels.add(new DataModel("Gingerbread", "Android 2.3", "9","December 6, 2010")); dataModels.add(new DataModel("Honeycomb","Android 3.0","11","February 22, 2011")); dataModels.add(new DataModel("Ice Cream Sandwich", "Android 4.0", "14","October 18, 2011")); dataModels.add(new DataModel("Jelly Bean", "Android 4.2", "16","July 9, 2012")); dataModels.add(new DataModel("Kitkat", "Android 4.4", "19","October 31, 2013")); dataModels.add(new DataModel("Lollipop","Android 5.0","21","November 12, 2014")); dataModels.add(new DataModel("Marshmallow", "Android 6.0", "23","October 5, 2015")); adapter= new CustomAdapter(dataModels,getApplicationContext()); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { DataModel dataModel= dataModels.get(position); Snackbar.make(view, dataModel.getName()+"\n"+dataModel.getType()+" API: "+dataModel.getVersion_number(), Snackbar.LENGTH_LONG) .setAction("No action", null).show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 

row_item.xml

          

Un exemple plus compact d’un adaptateur personnalisé (en utilisant le tableau de liste comme données):

 class MyAdapter extends ArrayAdapter { public ArrayAdapter(Context context, List objectList) { super(context, R.layout.my_list_item, R.id.textViewTitle, objectList.toArray()); } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = super.getView(position, convertView, parent); TextView title = (TextView) row.findViewById(R.id.textViewTitle); ImageView icon = (ImageView) row.findViewById(R.id.imageViewAccessory); MyObject obj = (MyObject) getItem(position); icon.setImageBitmap( ... ); title.setText(obj.name); return row; } } 

Et voici comment l’utiliser:

 List objectList = ... MyAdapter adapter = new MyAdapter(this.getActivity(), objectList); listView.setAdapter(adapter); 

BaseAdapter est le meilleur adaptateur personnalisé pour listview.

 Class MyAdapter extends BaseAdapter{} 

et il a beaucoup de fonctions telles que getCount() , getView() etc.

C’est très simple.

 import android.content.Context; import android.content.DialogInterface; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import java.util.List; /** * Created by Belal on 9/14/2017. */ //we need to extend the ArrayAdapter class as we are building an adapter public class MyListAdapter extends ArrayAdapter { //the list values in the List of type hero List heroList; //activity context Context context; //the layout resource file for the list items int resource; //constructor initializing the values public MyListAdapter(Context context, int resource, List heroList) { super(context, resource, heroList); this.context = context; this.resource = resource; this.heroList = heroList; } //this will return the ListView Item as a View @NonNull @Override public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { //we need to get the view of the xml for our list item //And for this we need a layoutinflater LayoutInflater layoutInflater = LayoutInflater.from(context); //getting the view View view = layoutInflater.inflate(resource, null, false); //getting the view elements of the list from the view ImageView imageView = view.findViewById(R.id.imageView); TextView textViewName = view.findViewById(R.id.textViewName); TextView textViewTeam = view.findViewById(R.id.textViewTeam); Button buttonDelete = view.findViewById(R.id.buttonDelete); //getting the hero of the specified position Hero hero = heroList.get(position); //adding values to the list item imageView.setImageDrawable(context.getResources().getDrawable(hero.getImage())); textViewName.setText(hero.getName()); textViewTeam.setText(hero.getTeam()); //adding a click listener to the button to remove item from the list buttonDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //we will call this method to remove the selected value from the list //we are passing the position which is to be removed in the method removeHero(position); } }); //finally returning the view return view; } //this method will remove the item from the list private void removeHero(final int position) { //Creating an alert dialog to confirm the deletion AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Are you sure you want to delete this?"); //if the response is positive in the alert builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //removing the item heroList.remove(position); //reloading the list notifyDataSetChanged(); } }); //if response is negative nothing is being done builder.setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); //creating and displaying the alert dialog AlertDialog alertDialog = builder.create(); alertDialog.show(); } } 

Source: Didacticiel Android ListView personnalisé

 public class CustomAdapter extends BaseAdapter{ ArrayList data; Context ctx; int index=0; public CustomAdapter(ArrayList data, Context ctx) { super(); this.data = data; this.ctx = ctx; } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return data.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertview, ViewGroup parent) { // TODO Auto-generated method stub View v=convertview; if(v==null){ LayoutInflater vi=LayoutInflater.from(ctx); v=vi.inflate(R.layout.messgeview,null); } RelativeLayout rlmessage=(RelativeLayout)v.findViewById(R.id.rlmessgeview); TextView tvisdn=(TextView)v.findViewById(R.id.tvisdn); TextView tvtitle=(TextView)v.findViewById(R.id.tvtitle); TextView tvauthor=(TextView)v.findViewById(R.id.tvauthor); TextView tvprice=(TextView)v.findViewById(R.id.tvprice); BookPojo bpj=data.get(position); tvisdn.setText(bpj.isdn+""); tvtitle.setText(bpj.title); tvauthor.setText(bpj.author); tvprice.setText(bpj.price+""); if(index%2==0) { rlmessage.setBackgroundColor(Color.BLUE); } else { rlmessage.setBackgroundColor(Color.YELLOW); } index++; return v; } } 
 import android.app.Activity; import android.content.Context; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import org.json.JSONObject; import java.util.ArrayList; public class OurteamAdapter extends BaseAdapter { Context cont; ArrayList llist; OurteamAdapter madap; LayoutInflater inflater; JsonHelper Jobj; Ssortingng Id; JSONObject obj = null; int position = 0; public OurteamAdapter(Context c,ArrayList Mi) { this.cont = c; this.llist = Mi; } @Override public int getCount() { // TODO Auto-generated method stub return llist.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return llist.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView == null) { LayoutInflater in = (LayoutInflater) cont.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); convertView = in.inflate(R.layout.doctorlist, null); } TextView category = (TextView) convertView.findViewById(R.id.button1); TextView title = (TextView) convertView.findViewById(R.id.button2); ImageView i1=(ImageView) convertView.findViewById(R.id.imageView1); category.setText(Html.fromHtml(llist.get(position).getGalleryName())); title.setText(Html.fromHtml(llist.get(position).getGalleryDetail())); if(llist.get(position).getImagesrc()!=null) { i1.setImageBitmap(llist.get(position).getImagesrc()); } else { i1.setImageResource(R.drawable.anandlogo); } return convertView; } }