Cómo personalizar listview usando baseadapter

Quiero crear un ListView personalizado como este:

TextView + ImageView en ListView

Creo que tengo que usar BaseAdapter pero no tengo idea al respecto.

main.xml:

     

custom.xml:

               

main.java:

 package com.example.sample; import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { ListView l1; String[] t1={"video1","video2"}; String[] d1={"lesson1","lesson2"}; int[] i1 ={R.drawable.ic_launcher,R.drawable.ic_launcher}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); l1=(ListView)findViewById(R.id.list); l1.setAdapter(new dataListAdapter(t1,d1,i1)); } class dataListAdapter extends BaseAdapter { String[] Title, Detail; int[] imge; dataListAdapter() { Title = null; Detail = null; imge=null; } public dataListAdapter(String[] text, String[] text1,int[] text3) { Title = text; Detail = text1; imge = text3; } public int getCount() { // TODO Auto-generated method stub return Title.length; } public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } public long getItemId(int position) { // TODO Auto-generated method stub return position; } public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = getLayoutInflater(); View row; row = inflater.inflate(R.layout.custom, parent, false); TextView title, detail; ImageView i1; title = (TextView) row.findViewById(R.id.title); detail = (TextView) row.findViewById(R.id.detail); i1=(ImageView)row.findViewById(R.id.img); title.setText(Title[position]); detail.setText(Detail[position]); i1.setImageResource(imge[position]); return (row); } } } 

Prueba esto.

 public class ListElementAdapter extends BaseAdapter{ String[] data; Context context; LayoutInflater layoutInflater; public ListElementAdapter(String[] data, Context context) { super(); this.data = data; this.context = context; layoutInflater = LayoutInflater.from(context); } @Override public int getCount() { return data.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView= layoutInflater.inflate(R.layout.item, null); TextView txt=(TextView)convertView.findViewById(R.id.text); txt.setText(data[position]); return convertView; } } 

Simplemente llame a ListElementAdapter en su actividad principal y configure Adapter en ListView.

Cree su propia clase BaseAdapter y úselo de la siguiente manera.

  public class NotificationScreen extends Activity { @Override protected void onCreate_Impl(Bundle savedInstanceState) { setContentView(R.layout.notification_screen); ListView notificationList = (ListView) findViewById(R.id.notification_list); NotiFicationListAdapter notiFicationListAdapter = new NotiFicationListAdapter(); notificationList.setAdapter(notiFicationListAdapter); homeButton = (Button) findViewById(R.id.home_button); } } 

Cree su propia clase BaseAdapter y su archivo xml por separado.

 public class NotiFicationListAdapter extends BaseAdapter { private ArrayList> data; private LayoutInflater inflater=null; public NotiFicationListAdapter(ArrayList data) { this.data=data; inflater =(LayoutInflater)baseActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public int getCount() { return data.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View vi=convertView; if(convertView==null) vi = inflater.inflate(R.layout.notification_list_item, null); ImageView compleatImageView=(ImageView)vi.findViewById(R.id.complet_image); TextView name = (TextView)vi.findViewById(R.id.game_name); // name TextView email_id = (TextView)vi.findViewById(R.id.e_mail_id); // email ID TextView notification_message = (TextView)vi.findViewById(R.id.notification_message); // notification message compleatImageView.setBackgroundResource(R.id.address_book); name.setText(data.getIndex(position)); email_id.setText(data.getIndex(position)); notification_message.setTextdata.getIndex(position)); return vi; } } 

Archivo xml BaseAdapter

       

Cámbielo en consecuencia y úselo.

Sugiero usar un Adaptador personalizado, primero cree un archivo Xml, por ejemplo layout/customlistview.xml

       

Suponiendo que tienes una clase personalizada como esta

 public class CustomClass { private long id; private String title, subtitle, picture; public CustomClass () { } public CustomClass (long id, String title, String subtitle, String picture) { this.id = id; this.title= title; this.subtitle= subtitle; this.picture= picture; } //add getters and setters } 

Y un CustomAdapter.java usa el xml-layout

 public class CustomAdapter extends ArrayAdapter { private Context context; private int resource; private LayoutInflater inflater; public CustomAdapter (Context context, List values) { // or String[][] or whatever super(context, R.layout.customlistviewitem, values); this.context = context; this.resource = R.layout.customlistview; this.inflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = (RelativeLayout) inflater.inflate(resource, null); CustomClass item = (CustomClass) getItem(position); TextView textviewTitle = (TextView) convertView.findViewById(R.id.title); TextView textviewSubtitle = (TextView) convertView.findViewById(R.id.subtitle); ImageView imageview = (ImageView) convertView.findViewById(R.id.image); //fill the textviews and imageview with the values textviewTitle = item.getTtile(); textviewSubtitle = item.getSubtitle(); if (item.getAfbeelding() != null) { int imageResource = context.getResources().getIdentifier("drawable/" + item.getImage(), null, context.getPackageName()); Drawable image = context.getResources().getDrawable(imageResource); } imageview.setImageDrawable(image); return convertView; } } 

¿Lograste hacerlo? No dude en preguntar si desea más información sobre algo 🙂

EDITAR : Cambió el adaptador para adaptarse a una lista en lugar de solo una lista

 private class ObjectAdapter extends BaseAdapter { private Context context; private Listobjects; public ObjectAdapter(Context context, List objects) { this.context = context; this.objects = objects; } @Override public int getCount() { return objects.size(); } @Override public Object getItem(int position) { return objects.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, parent, false); holder.text = (TextView) convertView.findViewById(android.R.id.text1); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.text.setText(getItem(position).toString())); return convertView; } class ViewHolder { TextView text; } }