【问题标题】:Custom Adapter for List View列表视图的自定义适配器
【发布时间】:2011-12-31 06:39:03
【问题描述】:

我想为我的列表视图创建一个custom adapter。有没有文章可以指导我如何创建一个并解释它是如何工作的?

【问题讨论】:

  • 这段代码运行良好androidexample.com/…
  • @Houcine 该链接不再可用。
  • @choz:我找不到我提到的链接,你可以用谷歌搜索,你只需点击“在 android 中使用自定义行的 ListView”,你会发现很多有用的教程;) .祝你好运

标签: android listview android-tablelayout custom-adapter


【解决方案1】:
public class ListAdapter extends ArrayAdapter<Item> {

    private int resourceLayout;
    private Context mContext;

    public ListAdapter(Context context, int resource, List<Item> items) {
        super(context, resource, items);
        this.resourceLayout = resource;
        this.mContext = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;

        if (v == null) {
            LayoutInflater vi;
            vi = LayoutInflater.from(mContext);
            v = vi.inflate(resourceLayout, 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;
    }

}

这是我在项目中使用的一个类。您需要收集要显示的项目,在我的情况下是&lt;Item&gt;。您需要覆盖View getView(int position, View convertView, ViewGroup parent) 方法。

R.layout.itemlistrow 定义了ListView 所在的行。

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content" android:orientation="vertical"
    android:layout_width="fill_parent">

    <TableRow android:layout_width="fill_parent"
              android:id="@+id/TableRow01"
              android:layout_height="wrap_content">

        <TextView android:textColor="#FFFFFF"
                  android:id="@+id/id"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:text="id" android:textStyle="bold" 
                  android:gravity="left"
                  android:layout_weight="1" 
                  android:typeface="monospace"
                  android:height="40sp" />
    </TableRow>

    <TableRow android:layout_height="wrap_content"
              android:layout_width="fill_parent">

        <TextView android:textColor="#FFFFFF" 
                  android:id="@+id/categoryId"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content"
                  android:text="categoryId" 
                  android:layout_weight="1" 
                  android:height="20sp" />

        <TextView android:layout_height="wrap_content"
                  android:layout_width="fill_parent" 
                  android:layout_weight="1"
                  android:textColor="#FFFFFF"
                  android:gravity="right"
                  android:id="@+id/description"
                  android:text="description" 
                  android:height="20sp" />
    </TableRow>

</TableLayout>

MainActivity中定义ListView这样,

ListView yourListView = (ListView) findViewById(R.id.itemListView);

// get data from the table by the ListAdapter
ListAdapter customAdapter = new ListAdapter(this, R.layout.itemlistrow, List<yourItem>);

yourListView .setAdapter(customAdapter);

【讨论】:

  • 谢谢你的代码。你能解释一下 getView 方法应该怎么写吗?
  • 没有必要在你的类中保留名为 items 的集合,你将它传递给超级构造函数。可以通过 getItem(int pos) 方法检索项目。
  • 为什么在getView中硬编码通过构造函数传入的资源ID?有没有办法只取回施工时提供的那个?
  • 我在这里的活动中遇到错误 ListView yourListView = (ListView) findViewById(R.id.itemListView);无法解析或不是字段
  • 我的项目是什么 ListAdapter customAdapter = new ListAdapter(this, R.layout.itemlistrow, List); ?
【解决方案2】:

我知道这已经被回答了......但我想举一个更完整的例子。

在我的示例中,将显示我们的自定义 ListViewListActivity 称为 OptionsActivity,因为在我的项目中,此 Activity 将显示我的用户可以设置来控制我的应用程序的不同选项。有两种列表项类型,一种列表项类型只有TextView,第二种列表项类型只有Button。您可以在每个列表项类型中放置您喜欢的任何小部件,但我让这个示例保持简单。

getItemView() 方法检查哪些列表项应该是类型 1 或类型 2。根据我在顶部定义的静态整数,前 5 个列表项将是列表项类型 1,最后 5 个列表项将是列表项类型 2。因此,如果您编译并运行它,您将拥有一个 ListView,其中包含五个仅包含 Button 的项目,然后是五个仅包含 TextView 的项目。

下面是Activity 代码、活动 xml 文件和每个列表项类型的 xml 文件。

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<String> mData = new ArrayList<String>();
        private LayoutInflater mInflater;

        public MyCustomAdapter() {
            mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        public void addItem(final String 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:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
     >

    <ListView
        android:id="@+id/optionsList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

list_item_type_1.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_item_type1_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/list_item_type1_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text goes here" />

</LinearLayout>

list_item_type2.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_item_type2_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/list_item_type2_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button text goes here" />

</LinearLayout>

【讨论】:

  • @YoushaAleayoub 在 java & kotlin 中存在 Enum 的序数。
【解决方案3】:

这段代码很容易理解。

three_horizo​​ntal_text_views_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/leftTextView"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/centreTextView"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/rightTextView"/>

</LinearLayout>

ThreeStrings.java

public class ThreeStrings {
    private String left;
    private String right;
    private String centre;

    public ThreeStrings(String left, String right, String centre) {
        this.left = left;
        this.right = right;
        this.centre = centre;
    }
}

ThreeHorizo​​ntalTextViewsAdapter.java

public class ThreeHorizontalTextViewsAdapter extends ArrayAdapter<ThreeStrings> {

private int layoutResource;

public ThreeHorizontalTextViewsAdapter(Context context, int layoutResource, List<ThreeStrings> threeStringsList) {
    super(context, layoutResource, threeStringsList);
    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);
    }

    ThreeStrings threeStrings = getItem(position);

    if (threeStrings != 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(threeStrings.getLeft());
        }
        if (rightTextView != null) {
            rightTextView.setText(threeStrings.getRight());
        }
        if (centreTextView != null) {
            centreTextView.setText(threeStrings.getCentre());
        }
    }

    return view;
}
      }

ma​​in_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.androidapplication.ListActivity">


    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView"></ListView>

</LinearLayout>

MainActivity.java

public class MainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<ThreeStrings> threeStringsList = 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);
      }
   //......}

【讨论】:

  • ThreeHorizontalTextViewsAdapter.java 的包是什么。和剩下的Activities一样吗
  • ThreeStrings 没有 getter 方法,但是你在代码中引用它们...
【解决方案4】:

Google 有一个名为 EfficientAdapter 的示例,我认为这是如何实现自定义适配器的最佳简单示例。 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html @CommonsWare 对上述示例中使用的模式进行了很好的解释 http://commonsware.com/Android/excerpt.pdf

【讨论】:

  • 好像宕机了(404),你知道它现在藏在哪里了吗?
  • @hotzen 我刚刚检查了链接,它们都还在。也许你这边有问题?
  • 没有“EfficientAdapter”示例。
【解决方案5】:

check this link,很简单,通过convertView,我们可以得到将在listview中显示的一行的布局(即parentView)。

View v = convertView;

if (v == null) {

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

}

使用位置,可以得到List&lt;Item&gt;的对象。

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)。

【讨论】:

    【解决方案6】:

    数据模型

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

    阵列适配器

    public class CustomAdapter extends ArrayAdapter<DataModel> implements View.OnClickListener{
        private ArrayList<DataModel> dataSet;
        Context mContext;
    
        // View lookup cache
        private static class ViewHolder {
            TextView txtName;
            TextView txtType;
            TextView txtVersion;
            ImageView info;
        }
    
        public CustomAdapter(ArrayList<DataModel> 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, false);
                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;
        }
    }
    

    主要活动

    public class MainActivity extends AppCompatActivity {
    
        ArrayList<DataModel> 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

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp">
    
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:text="Marshmallow"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="@android:color/black" />
    
    
        <TextView
            android:id="@+id/type"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/name"
            android:layout_marginTop="5dp"
            android:text="Android 6.0"
            android:textColor="@android:color/black" />
    
        <ImageView
            android:id="@+id/item_info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:src="@android:drawable/ic_dialog_info" />
    
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true">
    
            <TextView
                android:id="@+id/version_heading"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="API: "
                android:textColor="@android:color/black"
                android:textStyle="bold" />
    
            <TextView
                android:id="@+id/version_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="23"
                android:textAppearance="?android:attr/textAppearanceButton"
                android:textColor="@android:color/black"
                android:textStyle="bold" />
    
        </LinearLayout>
    
    </RelativeLayout>
    

    【讨论】:

      【解决方案7】:

      您可以在官方 ApiDemos 中查看this sample。它展示了如何扩展BaseAdapter 并将其应用于ListView。之后,只需查看BaseAdapter 的参考并尝试了解每个方法的作用(包括继承的方法)以及何时/如何使用它。

      另外,Google 是你的朋友 :)。

      【讨论】:

      • 是的,谷歌是朋友,但问题是你最终得到的点击是使用 arrayadapter 等废话。如果我从经验中不知道我正在寻找“baseadapter 的名称是什么”,我现在会去做不必要的复杂的 arraylist 适配器。
      • google 是我的朋友,因为有人提出问题,有人回答。如果没有人问谷歌不能成为我的朋友。所以请不要再说了。
      【解决方案8】:

      这是逐步创建用于列表视图的自定义适配器的完整演练 -

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

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

          BaseAdapter 是列表视图的最佳自定义适配器。

          Class MyAdapter extends BaseAdapter{}
          

          它具有getCount()getView()等多种功能。

          【讨论】:

            【解决方案11】:

            很简单。

            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<Hero> {
            
                //the list values in the List of type hero 
                List<Hero> 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<Hero> 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();
                }
            }
            

            来源:Custom ListView Android Tutorial

            【讨论】:

              【解决方案12】:
              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;
                  }
              }
              

              【讨论】:

                【解决方案13】:
                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;
                    }
                
                }
                

                【讨论】:

                  猜你喜欢
                  • 2012-02-21
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多