1. 程式人生 > >ListView優化總結(二)--Android

ListView優化總結(二)--Android

ride edittext over 變化 業務 適配器 全部 number moved

3.使用Activity和Delegate與適配器交互

這個內容是從書裏看到的,通過托付模式幫助開發人員把全部的業務邏輯從適配器中移到Activity中。

以下是加入電話號碼的樣例,列表中每一行都有一個removebutton,用於刪除電話號碼,在適配器中實現“Remove”button的點擊處理器,可是。並不在適配器中實現刪除對象的方法,我們通過一個托付接口調用Activity的方法刪除對象。

適配器的代碼:

public class NumbersAdapter extends ArrayAdapter<Integer> {


public static interface NumbersAdapterDelegate { //定義托付接口
void removeItem(Integer value);
}


private LayoutInflater mInflator;
private NumbersAdapterDelegate mDelegate;


public NumbersAdapter(Context context, List<Integer> objects) {
super(context, 0, objects);
mInflator = LayoutInflater.from(context);
}


@Override
public View getView(int position, View cv, ViewGroup parent) {


if (null == cv) {
cv = mInflator.inflate(R.layout.number_row, parent, false);
}


final Integer value = getItem(position);
TextView tv = (TextView) cv.findViewById(R.id.numbers_row_text);
tv.setText(value.toString());


View button = cv.findViewById(R.id.numbers_row_button);
button.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
if (null != mDelegate) {
mDelegate.removeItem(value); //刪除對象
}
}
});


return cv;
}


public void setDelegate(NumbersAdapterDelegate delegate) { //為適配器設置托付對象
mDelegate = delegate;
}


}


Activity的代碼:

public class MainActivity extends Activity implements
NumbersAdapter.NumbersAdapterDelegate { //實現NumbersAdapterDelegate接口
private static final String TAG = MainActivity.class
.getCanonicalName();


private ListView mListView;
private ArrayList<Integer> mNumbers;
private NumbersAdapter mAdapter;
private EditText mEditText;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


mEditText = (EditText) findViewById(R.id.main_edittext);
mListView = (ListView) findViewById(R.id.main_listview);
mNumbers = new ArrayList<Integer>();
mAdapter = new NumbersAdapter(this, mNumbers);
mListView.setAdapter(mAdapter);
}


@Override
protected void onResume() {
super.onResume();
mAdapter.setDelegate(this); //在onResume方法中註冊托付對象
}


@Override
protected void onPause() {
super.onPause();
mAdapter.setDelegate(null); //在onPause方法中取消註冊托付對象
}


@Override
public void removeItem(Integer value) { //從列表中移除指定項,然後通知適配器綁定的數據發生變化
mNumbers.remove(value);
Toast
.makeText(this, "Removed object: " + value, Toast.LENGTH_SHORT)
.show();
mAdapter.notifyDataSetChanged();
}


public void addNumber(View v) {
String value = mEditText.getText().toString().trim();
try {
mNumbers.add(Integer.valueOf(value));
mEditText.setText("");
mAdapter.notifyDataSetChanged();
} catch (NumberFormatException e) {
Log.e(TAG, "Couldn‘t convert to integer the string: " + value);
}
}
}


沒有在onCreate方法中設置托付對象,而在onResume方法中設置托付對象。目的是為了確保僅僅在Activity顯示在屏幕上的時候才作為托付對象使用。

ListView優化總結(二)--Android