Skip to content

Commit cdff10e

Browse files
committed
BaseAdapter和BaseView新增单选
1 parent aae41e1 commit cdff10e

4 files changed

Lines changed: 36 additions & 13 deletions

File tree

ZBLibrary(AndroidStudio)/ZBLibrary/src/main/java/zuo/biao/library/base/BaseAdapter.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
* <br> 适用于几乎所有列表、表格,包括:
2424
* <br> 1.RecyclerView及其子类
2525
* <br> 2.ListView,GridView等AbsListView的子类
26-
* <br> 3.RecyclerView刷新用 refresh 或 notifyDataSetChanged; AbsListView刷新用 refresh 或 notifyListDataSetChanged
26+
* <br> 3.刷新用 refresh 或 notifyListDataSetChanged,notifyDataSetChanged 可能无效
2727
* <br> 4.出于性能考虑,里面很多方法对变量(比如list)都没有判断,应在adapter外判断
2828
* @author SCWANG
2929
* @author Lemon
@@ -91,23 +91,41 @@ public void setOnLoadListener(OnLoadListener onLoadListener) {
9191
* <br > > 0 - 列表滚到倒数第preloadCount个Item View显示时加载更多
9292
* @use 可在子类getView被调用前(可以是在构造器内)赋值
9393
*/
94-
protected int preloadCount = 0;
94+
public int preloadCount = 0;
95+
9596

9697
//预加载,可不使用 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
9798

9899

100+
101+
102+
99103
/**bv的显示方法
100104
* @param position
101105
* @param bv
102106
*/
103107
@Override
104108
public void bindView(int position, BV bv) {
109+
bv.selected = isSelected(position);
105110
bv.bindView(getItem(position), position, getItemViewType(position));
106111
if (SettingUtil.preload && onLoadListener != null && position >= getCount() - 1 - preloadCount) {
107112
onLoadListener.onLoadMore();
108113
}
109114
}
110115

116+
/**
117+
* 已选中项的位置,一般可在onItemClick回调中:
118+
* <br /> adapter.selectedPosition = position;
119+
* <br /> adapter.notifyListDataSetChanged();
120+
*/
121+
public int selectedPosition = -1;
122+
/**是否已被选中,默认实现单选,重写可自定义实现多选
123+
* @param position
124+
* @return
125+
*/
126+
public boolean isSelected(int position) {
127+
return selectedPosition == position;
128+
}
111129

112130

113131

@@ -122,14 +140,12 @@ public List<T> getList() {
122140
*/
123141
public synchronized void refresh(List<T> list) {
124142
this.list = list == null ? null : new ArrayList<T>(list);
125-
notifyDataSetChanged(); //仅对 RecyclerView 有效
126143
notifyListDataSetChanged(); //仅对 AbsListView 有效
127144
}
128145

129146

130-
131-
132147
//RecyclerAdapter <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
148+
133149
@Override
134150
public BV onCreateViewHolder(final ViewGroup parent, int viewType) {
135151
final BV bv = createView(viewType, parent);
@@ -195,9 +211,9 @@ public void unregisterDataSetObserver(DataSetObserver observer) {
195211
/**
196212
* Notifies the attached observers that the underlying data has been changed
197213
* and any View reflecting the data set should refresh itself.
198-
* 仅对 AbsListView 有效
199214
*/
200215
public void notifyListDataSetChanged() {
216+
notifyDataSetChanged(); //仅对 RecyclerView 有效
201217
mDataSetObservable.notifyChanged();
202218
}
203219

ZBLibrary(AndroidStudio)/ZBLibrary/src/main/java/zuo/biao/library/base/BaseView.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,10 @@ public <V extends View> V findViewById(int id, OnClickListener listener) {
157157
* 视图类型,部分情况下需要根据viewType使用不同layout,对应Adapter的itemViewType
158158
*/
159159
public int viewType = 0;
160+
/**
161+
* 是否已被选中
162+
*/
163+
public boolean selected = false;
160164

161165
/**创建一个新的View
162166
* @return
@@ -204,6 +208,8 @@ public void bindView(T data_) {
204208
Log.w(TAG, "bindView data_ == null");
205209
}
206210
this.data = data_;
211+
212+
//不一定要用单选功能,实现也不一定要用这种方式,这里写会影响所有BaseView子类的性能,子类写更好 itemView.setSelected(selected);
207213
}
208214

209215
/**获取可见性

ZBLibrary(AndroidStudio)/app/src/main/java/zblibrary/demo/DEMO/DemoListFragment.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ public void initEvent() {//必须在onCreateView方法内调用
151151
//示例代码<<<<<<<<<<<<<<<<<<<
152152
@Override
153153
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
154+
//实现单选
155+
adapter.selectedPosition = adapter.selectedPosition == position ? -1 : position;
156+
adapter.notifyListDataSetChanged();
157+
154158
toActivity(UserActivity.createIntent(context, position));//一般用id,这里position仅用于测试 id));//
155159
}
156160
//示例代码>>>>>>>>>>>>>>>>>>>

ZBLibrary(AndroidStudio)/app/src/main/java/zblibrary/demo/DEMO/DemoView.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package zblibrary.demo.DEMO;
1616

1717
import android.app.Activity;
18-
import android.util.Log;
1918
import android.view.View;
2019
import android.view.View.OnClickListener;
2120
import android.view.ViewGroup;
@@ -72,13 +71,11 @@ public View createView() {
7271

7372

7473
@Override
75-
public void bindView(Entry<String, String> data){
74+
public void bindView(Entry<String, String> data_){
7675
//示例代码<<<<<<<<<<<<<<<<
77-
if (data == null) {
78-
Log.e(TAG, "bindView data == null >> data = new Entry<>(); ");
79-
data = new Entry<String, String>();
80-
}
81-
this.data = data;
76+
super.bindView(data_ != null ? data_ : new Entry<String, String>());
77+
78+
itemView.setBackgroundResource(selected ? R.drawable.alpha3 : R.drawable.white_to_alpha);
8279

8380
tvDemoViewName.setText(StringUtil.getTrimedString(data.getKey()));
8481
tvDemoViewNumber.setText(StringUtil.getTrimedString(data.getValue()));

0 commit comments

Comments
 (0)