Skip to content

Commit

Permalink
Adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
xieyangxuejun committed Apr 2, 2018
1 parent ac174d7 commit 7851302
Show file tree
Hide file tree
Showing 13 changed files with 693 additions and 1 deletion.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,6 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation project (':base')
}
49 changes: 49 additions & 0 deletions app/src/main/java/com/foretree/baseactivity/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
package com.foretree.baseactivity;

import android.support.v7.widget.LinearLayoutManager;

import com.foretree.base.DataBindingActivity;
import com.foretree.base.adapter.DataBindingRecyclerAdapter;
import com.foretree.base.adapter.DataBindingRecyclerHolder;
import com.foretree.baseactivity.databinding.ActivityMainBinding;
import com.foretree.baseactivity.databinding.ItemMainBinding;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends DataBindingActivity<ActivityMainBinding> {
private static List<Model> models = new ArrayList<>();

@Override
public int getContentViewId() {
Expand All @@ -13,5 +22,45 @@ public int getContentViewId() {
@Override
public void onAfterViews() {
getBinding().text.setText("hahahahahahha");
getBinding().list.setLayoutManager(new LinearLayoutManager(this));
for (int i = 0; i < 100; i++) {
models.add(new Model("item" + i));
}
getBinding().list.setAdapter(new Adapter(models));

}


public static class Adapter extends DataBindingRecyclerAdapter<Model, ItemMainBinding> {

public Adapter(List<Model> data) {
super(data);
}

@Override
protected int getItemLayoutId() {
return R.layout.item_main;
}

@Override
public void onBindViewHolder(DataBindingRecyclerHolder<ItemMainBinding> holder, int position, Model item) {
holder.binding.setModel(item);
}
}

public static class Model {
private String text;

public void setText(String text) {
this.text = text;
}

public String getText() {
return text;
}

public Model(String s) {
this.text = s;
}
}
}
6 changes: 6 additions & 0 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">

<TextView
Expand All @@ -16,6 +17,11 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>


Expand Down
17 changes: 17 additions & 0 deletions app/src/main/res/layout/item_main.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<layout>

<data>
<variable
name="model"
type="com.foretree.baseactivity.MainActivity.Model"/>
</data>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:text="@{model.text}"
android:layout_width="match_parent"
android:layout_height="wrap_content">

</TextView>
</layout>
3 changes: 2 additions & 1 deletion base/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ android {
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:recyclerview-v7:26.1.0'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
package com.foretree.base.adapter;

import android.support.annotation.LayoutRes;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
* Project AndroidBase
* Created by xieyangxuejun on 17-9-11.
*/
public abstract class AbstractRecyclerAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
private List<T> mData;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mItemLongClickListener;

public AbstractRecyclerAdapter(List<T> data) {
this.mData = data == null ? new ArrayList<T>() : data;
}


@Override
public void onBindViewHolder(VH holder, int position) {
T item;
try {
item = mData.get(position);
} catch (IndexOutOfBoundsException e) {
item = null;
}
this.onBindViewHolder(holder, position, item);
if (holder.itemView != null) {
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new OnItemClickListenerImpl(this, position));
}
if (mItemLongClickListener != null) {
holder.itemView.setOnLongClickListener(new OnItemLongClickListenerImpl(this, position));
}
}
}

public abstract void onBindViewHolder(VH holder, int position, T item);

@Override
public int getItemCount() {
return mData.size();
}

/**
* 获取条目数据
*
* @param position 要获取的对象在适配器中的位置
* @return position位置的对象
*/
public T getItem(int position) {
return mData.get(position);
}

/**
* 添加一个条目
*
* @param item 要添加的数据
*/
public void addItem(T item) {
mData.add(item);
notifyItemInserted(mData.size() - 1);
}

/**
* 添加一个条目到position位置
*
* @param position 指定的位置
* @param item 要添加的数据
*/
public void addItem(int position, T item) {
mData.add(position, item);
notifyItemInserted(position);
}

/**
* 添加多个条目
*
* @param collection 要添加的数据集合
*/
public void addItemAll(Collection<? extends T> collection) {
int oldSize = mData.size();
mData.addAll(collection);
notifyItemRangeInserted(oldSize, collection.size());
}

/**
* 添加多个条目到position位置
*
* @param position 指定的位置
* @param collection 要添加的数据集合
*/
public void addItemAll(int position, Collection<? extends T> collection) {
mData.addAll(position, collection);
notifyItemRangeInserted(position, collection.size());
}

/**
* 删除一个条目
* <p>为了避免notifyItemRemoved后导致position错乱,所以再调用notifyItemRangeChanged刷新position</p>
*
* @param position 要删除的位置
*/
public void removeItem(int position) {
mData.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, mData.size());
}


/**
* 删除多个条目
*
* @param collection 要删除的数据集合
*/
public void removeItemAll(Collection<? extends T> collection) {
mData.removeAll(collection);
notifyDataSetChanged();
}

/**
* 清空适配器数据
*/
public void clear() {
mData.clear();
//notifyDataSetChanged();
notifyItemRangeRemoved(0, mData.size());
}


public List<T> getData() {
return mData;
}

public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
}

public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
this.mItemLongClickListener = onItemLongClickListener;
}


/**
* 条目点击
*/
public interface OnItemClickListener {
void onItemClick(AbstractRecyclerAdapter adapter, View view, int position);
}

/**
* 条目长按
*/
public interface OnItemLongClickListener {
boolean onItemLongClick(AbstractRecyclerAdapter adapter, View view, int position);
}


protected static class OnItemClickListenerImpl implements View.OnClickListener {
private AbstractRecyclerAdapter mAdapter;
private int mPosition;

public OnItemClickListenerImpl(AbstractRecyclerAdapter adapter, int position) {
this.mAdapter = adapter;
this.mPosition = position;
}

@Override
public void onClick(View v) {
mAdapter.mOnItemClickListener.onItemClick(mAdapter, v, mPosition);
}
}

protected static class OnItemLongClickListenerImpl implements View.OnLongClickListener {
private AbstractRecyclerAdapter mAdapter;
private int mPosition;

public OnItemLongClickListenerImpl(AbstractRecyclerAdapter adapter, int position) {
this.mAdapter = adapter;
this.mPosition = position;
}

@Override
public boolean onLongClick(View v) {
return mAdapter.mItemLongClickListener.onItemLongClick(mAdapter, v, mPosition);
}
}


public static abstract class RecyclerHolder<T> extends RecyclerView.ViewHolder {

public RecyclerHolder(View itemView) {
super(itemView);
}

public RecyclerHolder(ViewGroup parent, @LayoutRes int layoutId) {
this(LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false));
}

public abstract void onBindViewHolder(int position, T item);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.foretree.base.adapter;

import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import java.util.List;

/**
* Project AndroidBase
* Created by xieyangxuejun on 17-9-11.
*/
public abstract class DataBindingRecyclerAdapter<T, B extends ViewDataBinding> extends AbstractRecyclerAdapter<T, DataBindingRecyclerHolder<B>> {

public DataBindingRecyclerAdapter(List<T> data) {
super(data);
}

@Override
public DataBindingRecyclerHolder<B> onCreateViewHolder(ViewGroup parent, int viewType) {
return new DataBindingRecyclerHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), getItemLayoutId(), parent, false));
}

protected abstract int getItemLayoutId();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.foretree.base.adapter;

import android.databinding.ViewDataBinding;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
* Project AndroidBase
* Created by xieyangxuejun on 17-9-11.
*/
public class DataBindingRecyclerHolder<B extends ViewDataBinding> extends RecyclerView.ViewHolder {
public B binding;

public DataBindingRecyclerHolder(B binding) {
this(binding.getRoot());
this.binding = binding;
}


public DataBindingRecyclerHolder(View v) {
super(v);
}
}
Loading

0 comments on commit 7851302

Please sign in to comment.