listView多個佈局複用

1、關於listView多個佈局複用的問題,主要是重寫一個方法,通過該方法在不同的位置設置不同的類型,這裏共兩種類型,不同條件是返回不同的類型,然後在getview方法中通過不同的類型加載不同的佈局,具體的邏輯在後面的代碼中實現

獲取每一個item的類型
@Override
public int getItemViewType(int position) {
    if (personalNewses.get(position).getIs_read() == 0) {
        return WITH_POINT;
    }
    return WITHOUT_POINT;
}

2、整個adapter如下

/**
 * 個人消息適配器
 * Created by leven on 2016/11/25.
 */

public class PersonalNewsAdapter extends BaseAdapter {
    private static final int WITH_POINT = 0x0;//帶紅色圓點的佈局
    private static final int WITHOUT_POINT = 0x1;//不帶紅色原點的已讀消息;
    private Context context;
    private List<PersonalNews> personalNewses = new ArrayList<>();

    public PersonalNewsAdapter(Context context, List<PersonalNews> personalNewses) {
        this.context = context;
        if (personalNewses != null) {
            this.personalNewses = personalNewses;
        }
    }

    public void setPersonalNewses(List<PersonalNews> personalNewses) {
        if (personalNewses != null) {
            this.personalNewses = personalNewses;
        }

    }

    @Override
    public int getCount() {
        return personalNewses.size();
    }

    @Override
    public PersonalNews getItem(int i) {
        return personalNewses.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public int getItemViewType(int position) {
        if (personalNewses.get(position).getIs_read() == 0) {
            return WITH_POINT;//isRead爲0時返回該類型
        }
        return WITHOUT_POINT;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder vh_with_point = null;//不同的佈局使用不同的ViewHolder對象
        ViewHolder vh_without_point = null;
        int pointYype = getItemViewType(i);
        //根據類型判斷選用哪種佈局
        switch (pointYype) {
            case WITH_POINT:
        //此處有個技巧,view爲空,加載佈局時放入else中
                if (view != null && view instanceof NewsItemWithPointLayout) {
                    vh_with_point = (ViewHolder) view.getTag();
                } else {
                    view = LayoutInflater.from(context).inflate(R.layout.item_personal_news, null);
                    vh_with_point = new ViewHolder();
                    vh_with_point.tv_title = (TextView) view.findViewById(R.id.tv_title);
                    vh_with_point.tv_type = (TextView) view.findViewById(R.id.tv_type);
                    vh_with_point.tv_circle_point = (TextView) view.findViewById(R.id.tv_circle_point);
                    vh_with_point.tv_priority = (TextView) view.findViewById(R.id.tv_priority);
                    view.setTag(vh_with_point);
                }
                if (personalNewses != null && personalNewses.size() > 0) {


                    vh_with_point.tv_circle_point.setVisibility(View.VISIBLE);
                    BadgeView badgeView = new BadgeView(context);
                    badgeView.setBadgeCount(1);
                    badgeView.setWidth(20);
                    badgeView.setHeight(20);
                    badgeView.setTextColor(Color.RED);
                    badgeView.setBackground(10, Color.RED);
                    badgeView.setGravity(Gravity.CENTER_VERTICAL);
                    badgeView.setBadgeMargin(0, 12, 0, 0);
                    badgeView.setTargetView(vh_with_point.tv_circle_point);
                    //設置標題
                    vh_with_point.tv_title.setText(personalNewses.get(i).getTitle());
                    //設置類型
                    int type = personalNewses.get(i).getType();
                    if (type == 0) {
                        vh_with_point.tv_type.setText("溝通");
                    } else if (type == 1) {
                        vh_with_point.tv_type.setText("通知");
                    } else if (type == 2) {
                        vh_with_point.tv_type.setText("應答");
                    }
                    //設置優先級別
                    int pri = personalNewses.get(i).getPri();
                    if (pri == 1) {
                        vh_with_point.tv_priority.setText("知會");
                    } else if (pri == 2) {
                        vh_with_point.tv_priority.setText("普通");
                    } else if (pri == 3) {
                        vh_with_point.tv_priority.setText("緊急");
                    }
                }
                break;
            case WITHOUT_POINT:
                if (view != null && view instanceof NewsItemWithoutPointLayout) {
                    vh_without_point = (ViewHolder) view.getTag();
                } else {
                    view = LayoutInflater.from(context).inflate(R.layout.item_personal_news_not_point, null);
                    vh_without_point = new ViewHolder();
                    vh_without_point.tv_title = (TextView) view.findViewById(R.id.tv_title);
                    vh_without_point.tv_type = (TextView) view.findViewById(R.id.tv_type);
//                    vh_without_point.tv_circle_point = (TextView) view.findViewById(R.id.tv_circle_point);
                    vh_without_point.tv_priority = (TextView) view.findViewById(R.id.tv_priority);
                    view.setTag(vh_without_point);
                }
                if (personalNewses != null && personalNewses.size() > 0) {
                    //設置標題
                    vh_without_point.tv_title.setText(personalNewses.get(i).getTitle());
                    //設置類型
                    int type = personalNewses.get(i).getType();
                    if (type == 0) {
                        vh_without_point.tv_type.setText("溝通");
                    } else if (type == 1) {
                        vh_without_point.tv_type.setText("通知");
                    } else if (type == 2) {
                        vh_without_point.tv_type.setText("應答");
                    }
                    //設置優先級別
                    int pri = personalNewses.get(i).getPri();
                    if (pri == 1) {
                        vh_without_point.tv_priority.setText("知會");
                    } else if (pri == 2) {
                        vh_without_point.tv_priority.setText("普通");
                    } else if (pri == 3) {
                        vh_without_point.tv_priority.setText("緊急");
                    }
                }
                break;
        }


        return view;
    }

    class ViewHolder {
        TextView tv_title;
        TextView tv_type;
        TextView tv_priority;
        TextView tv_circle_point;
    }
}

總結:ListView的使用較爲靈活,加載多個佈局時建議使用RecycleView(ViewHolder的優化更好,而且可以水平顯示,可以瀑布流),而ListView緊可以垂直顯示,有一定的缺陷,推薦RecycleView。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章