6

我必须显示一个包含不同类型视图的列表。所以我必须用一个适配器定义一个 ListView,我必须在其中膨胀多个视图。我已经完成了给出的示例,但问题是我的列表不是对称的,就像标题在 4 个项目之后每次重复的示例一样。所以我面临重复使用物品的问题getView()

 public View getView(int position, View convertView, ViewGroup parent) {   
    int type = getItemViewType(position);
    if (convertView == null) {
        holder = new ViewHolder();
        switch (type) {
             case TYPE_1:
             convertView = mInflater.inflate(R.layout.item1, null);
             .......
             break;

             case TYPE_2:
             convertView = mInflater.inflate(R.layout.item2, null);
             .......
             break;
        }
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }
    ............
    ............
}

现在如果convertView 不为null,但之前使用的项目类型不同,那么布局将不匹配。这段代码将如何处理这个问题?

4

3 回答 3

4

您可以查看此示例适配器。getViewTypeCount 方法返回您的不同类型行。getItemViewType 方法,如果位置等于 0,则膨胀第一行布局,否则膨胀其他行布局。您可以自定义此代码示例。

    import java.util.List;
    import android.app.Activity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;

    /**
     * Created by MustafaS on 9.2.2015.
     */
    public class CustomArrayAdapter extends ArrayAdapter<YourModel> {

       @Override
       public int getItemViewType(int position) {

          if (position == 0) {
             return 0;
          }
          else {
             return 1;
          }
       }

       @Override
       public int getViewTypeCount() {
          return 2;
       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
          int type = getItemViewType(position);
          if (type == 0) {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_first_row, parent, false);
                viewHolderFirst = new ViewHolderFirst();
                convertView.setTag(viewHolderFirst);
             }
             else {
                viewHolderFirst = (ViewHolderFirst) convertView.getTag();
             }

          }
          else {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_other_row, parent, false);
                viewHolder = new ViewHolder();

             }
             else {
                viewHolder = (ViewHolder) convertView.getTag();
             }
          }
          return convertView;
       }

       protected class ViewHolderFirst {
          private RunnableViewPager pager;
          private CircleIndicator   indicator;
       }

       protected class ViewHolder {
          private ImageView imageviewRestaurant;
          private TextView  textviewRestaurantName;
          private TextView  textviewType;
          private TextView  textviewPrice;
          private TextView  textviewDistance;
          private ImageView imageviewCall;
          private ImageView imageviewCalendar;
       }
    }
于 2015-04-06T08:32:10.397 回答
0

您可以通过覆盖方法getViewCount()getItemViewType(int position)

首先,您只需返回您拥有的不同视图的数量。

在第二个中,您为每个不同的视图返回一个唯一标识符。

然后在您的getView()方法中检查视图类型并为它膨胀正确的布局。

有关该主题的更多信息:Android ListView with different layouts for each row

每行具有不同布局的Android ListView

于 2015-04-06T08:20:40.877 回答
0

这是您在 ListView 或 RecyclerView 中使用不同类型的视图时需要使用的:-

getItemViewType() and getViewTypeCount()

首先,您需要使用 getViewTypeCount() 并返回列表中所需的唯一视图数。然后覆盖 getItemViewType() 并根据您希望视图在 ListView 内更改的任何条件返回视图类型。

希望它会有所帮助。

于 2015-04-06T08:29:43.730 回答