自訂控制項之android列表分組及字母導航
有了以上兩篇文章的重構,現在把ListView分組列表重構為自訂控制項就會非常簡單,只需要把初始化操作放在自訂控制項的建構函式裡面。重構後的自訂控制項以上一篇的註解重構為基礎。
基本結構
這裡首先貼上一張上篇文章重構後的activity的代碼結構,相關的方法實現在之前兩篇文章中都有貼出。
再貼一張重構後的View的結構。可見兩者的結構都及其相似。不同的是上邊的activity中有抽象方法getDataList(),而下邊的沒有,但是多了一個ILoadRulerData iLoadData 類型的介面。用於載入資料。
且自訂View中把activity 中initdata()方法改為loaddata(),以供主動調用後開始載入資料。<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8cD7W2Lm5uvO7+bG+tPrC68jnz8KjrMqhwtTBy9K7sr+31rrN1q7HsNbYuLS1xLT6wuujujwvcD4KPHA+ytfPyMrHyv2+3bzT1Ni907/ao7o8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;">public interface ILoadRulerData { public List getDataList(); }
然後是自訂view的基本代碼:
/** * @Description: 需要先調用 setiLoadData,設定擷取資料的介面,然後再調用 loadData方法 */public class RulerView extends LinearLayout{ private View baseView; private TextView noDataView; private TextView RulerTag; private ProgressBarWithText progress; private ListView listView; private RulerWidget ruler; private ILoadRulerData iLoadData; private List originalList; public List> dealedList; private HashMap tagLocation = new HashMap(); private RulerAdapter rulerAdapter; public RulerView(Context context) { super(context); init( context); } public RulerView(Context context, AttributeSet attrs) { super(context, attrs); init( context); } public RulerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs); init( context); } /** * @Description: 設定資料載入介面 * @param * @return void */ public void setiLoadData(ILoadRulerData iLoadData) { this.iLoadData = iLoadData; } private void init(Context context){ baseView = LayoutInflater.from(context).inflate(R.layout.g_ruler, null); noDataView = (TextView) baseView.findViewById(R.id.g_base_list_nodata); RulerTag = (TextView) baseView.findViewById(R.id.g_ruler_tag); progress = (ProgressBarWithText) baseView.findViewById(R.id.g_base_progressbar_withtext); listView = (ListView) baseView.findViewById(R.id.g_base_list); ruler = (RulerWidget) baseView.findViewById(R.id.g_ruler); progress.setVisibility(View.VISIBLE); RulerTag.setVisibility(View.GONE); noDataView.setVisibility(View.GONE); listView.setVisibility(View.GONE); ruler.setVisibility(View.GONE); addView(baseView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); } public void loadData(){ new GetDataAsyTask().execute(); } 。。。。。 }
測試布局
<******.ruler.view.RulerView android:id="@+id/test_ruler_view_id" android:layout_width="match_parent" android:layout_height="wrap_content" />
Activity
public class TestViewActivity extends Activity{ private RulerView rulerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_ruler_view); rulerView = (RulerView) findViewById(R.id.test_ruler_view_id); rulerView.setiLoadData(new ILoadRulerData() { @Override public List getDataList() { return new TestAnnnoDao().getBoList(); } }); rulerView.loadData(); }}
此系列完畢。