【问题标题】:Create CustomAdapter for listView with different row layouts为具有不同行布局的 listView 创建 CustomAdapter
【发布时间】:2014-09-16 11:48:50
【问题描述】:

我想向 ListView 添加不同的行。在第一行中,我想显示一个 textView。在第二个两个 imageViews 和第三行单个 textView。然后是带有图标的文本列表。我知道这可以使用自定义 CustomAdapter。但不知道如何进行。
我的自定义适配器:

       public class CustomList extends ArrayAdapter<String>
 {
 private final Activity context;
 private final String[] web;
 private final Integer[] imageId;

 public CustomList(Activity context,
        String[] web, Integer[] imageId) {
    super(context, R.layout.drawer_list_item, web);
    this.context = context;
    this.web = web;
    this.imageId = imageId;
   }
    @Override
    public View getView(int position, View view, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();

    View rowView= inflater.inflate(R.layout.drawer_list_item, null, true);
    TextView txtTitle = (TextView) rowView.findViewById(R.id.text1);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.drawer_imgIcom);
    txtTitle.setText(web[position]);
    imageView.setImageResource(imageId[position]);

    return rowView;
  }

【问题讨论】:

  • 我用谷歌搜索。但无法理解如何将不同的行传递给适配器类。基本不明白怎么用写的customAdapter类。
  • 你看到这个问题的问题了吗?关于这个主题有很多详细的教程,所以如果你不强调是什么导致了你的问题,我们怎么可能为你提供比简单的谷歌搜索已经提供的更完整的答案?一个更好的问题是:我尝试这样做 [your code] 但它对我不起作用,因为我期待 [result] 并且我得到 [error stacktrace/other result]。

标签: android android-listview custom-adapter


【解决方案1】:

在您的drawer_list_item xml 文件中创建您需要的所有元素、文本、图像等,并根据需要进行定位。然后在 inflate 之后的 getView() 中,根据位置简单的隐藏和显示这些元素。

记得隐藏和显示,因为 Android 会重复使用视图。

您还应该考虑使用 viewHolder,因为这会提高性能。

【讨论】:

  • 以及我如何将每个行之王的视图详细信息传递给适配器类。我添加一种视图的代码。 CustomList 适配器 = new CustomList(MainActivity.this, categories, category_images); mDrawerList = (ListView) findViewById(R.id.left_drawer);
  • 在适配器中创建成员列表:private ArrayList mList;像这样创建一个 CustomList 构造函数: public CustomList(Context context, Fragment fragment, ArrayList items){ mList = items;然后在你的 getView 中你可以做 mList.get(position) 这只是一个简单粗暴的例子。对于完整的示例,请快速搜索一些列表视图适配器示例。
【解决方案2】:

在 getview() 中试试这个代码,

@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();

View rowView= inflater.inflate(R.layout.drawer_list_item, null, true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.text1);
ImageView imageView = (ImageView) rowView.findViewById(R.id.drawer_imgIcom);
ImageView imageView1 = (ImageView) rowView.findViewById(R.id.drawer_imgIcom1);

 if(position == 0)
 {
   txtTitle.setText(web[position]);
   imageView.setvisibility(View.GONE);
   imageView1..setvisibility(View.GONE);
 }
else if(Position == 1){
txtTitle.setText(web[position]);
imageView.setvisibility(View.Visible);
imageView1..setvisibility(View.Visible);
imageView.setImageResource(imageId[position]);
imageView1.setImageResource(imageId1[position]); 

}else
{
 txtTitle.setText(web[position]);
 imageView.setvisibility(View.GONE);
 imageView1..setvisibility(View.GONE);
 }

 return rowView;}

然后在您的 xml 布局中使用相应的视图。

【讨论】:

  • 感谢普拉卡什。但是在将适配器设置为 listView 时,我传递了两个数组 categories 和 category_array,每个数组包含 7 个项目。 CustomList 适配器 = new CustomList(MainActivity.this, categories, category_images);我将如何为这种情况设置适配器。
  • 我们不了解您的概念,我们只是帮助您,了解您的逻辑。自己尝试一下。
【解决方案3】:

首先你需要你的自定义视图(这包含你需要的视图)

示例:

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

    <ImageView
        android:id="@+id/photo"
        android:layout_width="match_parent"
        android:layout_height="170dp"
        android:background="@android:color/holo_blue_light"
        android:contentDescription="@string/cd_pr_photo"
        android:scaleType="centerCrop" />

    <!--Invisible divider so we can put our views just in the
    right place :) -->
    <View
        android:id="@+id/divider"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_below="@id/photo" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/divider"
        android:layout_margin="10dp"
        android:text="@string/sample_title"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        android:textStyle="bold|italic" />

    <ImageButton
        android:id="@+id/share"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/divider"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_margin="10dp"
        android:background="@android:drawable/ic_menu_share"
        android:contentDescription="@string/cd_the_sharebutton" />

</RelativeLayout>

一旦你决定了你的布局,你就可以在你的 CustomAdapterClass 中扩展 ArrayAdapter。

例子:

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

        //In case we don't have an inflated view, inflate.
        if (v == null) {
            v = View.inflate(getContext(), R.layout.custom_puertorico_layout, null);
        }

        //The domain object with data.
        PuertoRico p = getItem(position);


        //Photo of Puerto Rico
        final ImageView photo = (ImageView) v.findViewById(R.id.photo);
        photo.setImageDrawable(p.getPicture());

        //Given Title
        TextView title = (TextView) v.findViewById(R.id.title);
        title.setText(p.getTitle());

        //Extra stuff...
        ImageButton share = (ImageButton) v.findViewById(R.id.share);



        return v;
    }

这个简单的例子和​​完整的代码可以在https://github.com/JRSosa/PRPics找到

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 2013-11-12
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多