我想为列表视图创建一个自定义适配器。有没有任何文章可以告诉我如何创建一个,并解释它是如何工作的?


当前回答

下面是逐步为列表视图创建自定义适配器的完整步骤

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

public class CustomAdapter extends BaseAdapter{   
    String [] result;
    Context context;
 int [] imageId;
      private static LayoutInflater inflater=null;
    public CustomAdapter(MainActivity mainActivity, String[] 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;
    }

} 

其他回答

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<OurteamModel> llist;
    OurteamAdapter madap;
    LayoutInflater inflater;
    JsonHelper Jobj;
    String Id;
    JSONObject obj = null;
    int position = 0;
    public OurteamAdapter(Context c,ArrayList<OurteamModel> 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;
    }

}

谷歌有一个名为EfficientAdapter的示例,在我看来,它是如何实现自定义适配器的最佳简单示例。http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html @CommonsWare很好地解释了上面例子中使用的模式 http://commonsware.com/Android/excerpt.pdf

检查这个链接,在非常简单的通过convertView,我们可以得到一行的布局,这将显示在listview(这是parentView)。

View v = convertView;

if (v == null) {

    LayoutInflater vi;
    vi = LayoutInflater.from(getContext());
    v = vi.inflate(R.layout.itemlistrow, null);

}

使用position,你可以得到List<Item>的对象。

Item p = items.get(position);

在此之后,我们必须将对象的所需细节设置为标识的表单小部件。

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

然后它将返回构造的视图,该视图将附加到parentView(这是一个ListView/GridView)。

一个更紧凑的自定义适配器的例子(使用列表数组作为我的数据):

class MyAdapter extends ArrayAdapter<Object> {
    public ArrayAdapter(Context context, List<MyObject> 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;
    }
}

下面是如何使用它:

List<MyObject> objectList = ...
MyAdapter adapter = new MyAdapter(this.getActivity(), objectList);
listView.setAdapter(adapter);
public class CustomAdapter extends BaseAdapter{

    ArrayList<BookPojo> data;
    Context ctx;
    int index=0;

    public CustomAdapter(ArrayList<BookPojo> 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;
    }
}