複数レイアウトのカプセル化は、インターフェースデータバインディングを処理する主な開発は、インターフェースは、データバインディング、レイアウトビューを戻します、初期ホルダように、識別としてビュータイプビューのレイアウトが返されるタグホルダークラス属性を提供する際の方法bindDataデータバインディング、ItemViewホルダー、順にfindViewByIdを取得し、その後、ホルダタイプを決定するためのスイッチ(holder.gettag())。バックビューレイアウト:メインハンドル複数の論理レイアウト、レイアウト復帰どのような状況下で
アダプタ:一般的なパッケージホルダーを生成するためのアダプタ、パラメータが同時にレイアウト処理onCreateViewHolderで表示及びレイアウトIDは、id属性は、タグホルダー化合物は、その後追加された:異なるレイアウトホルダを識別します。
public abstract class RecycleViewAdapterUtil extends RecyclerView.Adapter<ViewHolder>{
List list;
Context context;
public RecycleViewAdapterUtil(Context context, List list){
this.list = list;
this.context = context;
}
@Override
public int getItemViewType(int position) {
return this.get_ItemViewType(position);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
ViewHolder holder = new ViewHolder(LayoutInflater.from(context).inflate(i, viewGroup, false),i);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
bindData(holder,position);
}
@Override
public int getItemCount() {
return get_ItemCount();
}
public abstract int get_ItemCount();//此抽象方法用来返回自定义的item总个数
public abstract int get_ItemViewType(int position);//此抽象方法是用来抽象出去让开发者自己定义返回的layout的对应Id
public abstract void bindData(ViewHolder holder, int i);//因为自定义复杂布局所以不知道当前的item布局,需要抽象出去让开发者自己根据当前布局处理数据
}
ホルダークラス:いくつかのヘルパーメソッドの追加getViewメソッド、ホルダークラスのセット***は、すべての後、活動に書かれた言葉で、それはあまりにも多くのです。メモリ・マップのセーブ以上でSaprseArray Androidのスパース配列。
public class ViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> Views;
View myItemView;
int tag;//viewholder标识符,来标识不同的viewholder
private View.OnClickListener onItemClickLitener;
private View.OnLongClickListener onLongClickListener;
public ViewHolder(@NonNull View itemView, int tag) {
super(itemView);
this.myItemView = itemView;
this.tag = tag;
this.Views = new SparseArray<View>();
}
public int getTag() {
return tag;
}
public View getView(int viewID) {
View view = Views.get(viewID);
if (view == null)
{
view = myItemView.findViewById(viewID);
Views.put(viewID, view);
}
return view;
}
//设置监听的方法
public void setOnItemClickLitener(View.OnClickListener onItemClickLitener) {
myItemView.setOnClickListener(onItemClickLitener);
}
//设置长按监听
public void setOnLongClickListener(View.OnLongClickListener onLongClickListener) {
myItemView.setOnLongClickListener(onLongClickListener);
}
public ViewHolder setText(int viewID, String str) {
TextView textView = (TextView) this.getView(viewID);
textView.setText(str);
return this;
}
public ViewHolder setImage(int viewID, String imgStr, Context context) {
ImageView imageView = (ImageView) this.getView(viewID);
Glide.with(context).load(imgStr).into(imageView);//这里用了Glide框架我用来连接网络图片
return this;
}
コール:マルチレイアウトのために、最も重要なことは、論理のレイアウトタイプを返すことである、ある、get_ItemViewTypeメソッドが返すのレイアウト(R.layout.bujuitem)は、get_ItemViewTypeの具体的な実装方法では、あなたが達成したいもののロジックに応じて異なるレイアウトを返すことができますレイアウトは、ItemIDを。これは、底部がローディングバー、アイテムの合計はlist.size()+ 1を加え直下で、レイアウトは、データの種類混合されている場合、リスト内のリスト、例えばリスト<ユーザ>を記憶されたデータの種類を配置することができ、ユーザークラスは、プロパティtype1,2,3の種類を一覧表示することができます(このtype1,2,3として:学生グループ、教師のグループ、学校のグループは、異なるレイアウトのロゴをとることができる、type1.size()このレイアウトの数1であります,,,)
結合データについては、単にholder.getTag()メソッドに従ってホルダーの現在のレイアウトを取得するために、ラインに直接データを埋めます。
ryviewdapter = new RecycleViewAdapterUtil(cookActivity.this, list) {
@Override
public int get_ItemViewType(int position) {//返回布局
if (position == list.size()) {
return R.layout.viewfooter;
}
return R.layout.cook_namelist;
}
@Override
public int get_ItemCount() {
return list.size() + 1;
}
@Override
public void bindData(final ViewHolder holder, int position) {
switch (holder.getTag()) {
case R.layout.cook_namelist:
JsonObject jsonObject = list.get(position);
holder.setImage(R.id.list_cook_image, jsonObject.get("pic").getAsString(), cookActivity.this)
.setText(R.id.list_cook_name, "《" + jsonObject.get("name").getAsString() + "》" + "(" + jsonObject.get("peoplenum").getAsString() + ")(" + jsonObject.get("cookingtime").getAsString() + ")")
.setText(R.id.list_cook_content, jsonObject.get("content").getAsString())
.setText(R.id.list_cook_tag, "饮食标签:" + jsonObject.get("tag").getAsString() + position)
.setOnItemClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(cookActivity.this, cook_detail.class);
Bundle bundle = new Bundle();
bundle.putString("cook_selected", new Gson().toJson(list.get(holder.getAdapterPosition())));
intent.putExtras(bundle);
cookActivity.this.startActivity(intent);
}
});
break;
case R.layout.viewfooter:
if (data.ishavemore && data.isloadmore) {
holder.getView(R.id.view_foot_progressbar).setVisibility(View.VISIBLE);
((TextView) holder.getView(R.id.view_foot_more)).setText("加载中");
} else if (data.isloadmore) {
holder.getView(R.id.view_foot_progressbar).setVisibility(View.GONE);
((TextView) holder.getView(R.id.view_foot_more)).setText("无结果");
}
break;
}
}
};
対話と同様のレイアウトを取り付けている顧客サービス
次に、コードを添付する。
写了机器人的xml在左边显示,人在右边显示(至于需要图片显示为圆形的,自行在网上找CircleImageView)
robot:xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/eyeopen"
android:background="@color/colorAccent"/>
<TextView
android:id="@+id/robot_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_marginLeft="10dp"
android:background="#d1d1d1"
android:layout_gravity="center_vertical"
android:text="robot的回复消息"/>
</LinearLayout>
people:xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right">
<TextView
android:id="@+id/people_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_marginLeft="50dp"
android:layout_marginRight="10dp"
android:layout_gravity="center_vertical"
android:background="#d1d1d1"
android:text="你在吗?" />
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@color/primary"
android:src="@drawable/eyeclose"/>
</LinearLayout>
adapterutil:
adapterUtil = new RecycleViewAdapterUtil(this,list) {
@Override
public int get_ItemCount() {
return list.size();
}
@Override
public int get_ItemViewType(int position) {
if (list.get(position).getRole()==0){
return R.layout.robot_robot_item;
}
return R.layout.robot_people_item;
}
@Override
public void bindData(ViewHolder holder, int i) {
switch (holder.getTag()){
//图片我都是在xml里写死的,毕竟人的图片,客服的图片又不会变
case R.layout.robot_robot_item:
holder.setText(R.id.robot_text,list.get(i).getText());
break;
case R.layout.robot_people_item:
holder.setText(R.id.people_text,list.get(i).getText());
break;
}
}
};
recyclerView.setAdapter(adapterUtil);
实体类:
public class role {
int role = 0;//初始为0:机器人;1:人
String text = "";//说的话
public role(int role,String text){
this.role = role;
this.text = text;
}
public int getRole() {
return role;
}
public void setRole(int role) {
this.role = role;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}