(請參閱編輯應用RecyclerView下文)
就像我在我的評論中提到,它肯定是細到對所有的活動,使用不同的數據和觀點單獨的適配器。隨着您的應用數據和佈局變得越來越複雜,您的代碼也變得越來越複雜......這就是它的方式。
但是,如果您的某些活動在其ListView中使用了類似的數據(例如,可能是兩個TextView和一個ImageButton),您可以通過定義可用於多個活動的單個適配器來節省一些工作量。然後,您會爲每個Activity實例化單獨的對象,類似於創建多個ArrayAdapter<String>
對象以填充多個ListViews的方式。
編寫自定義適配器時,BaseAdapter
是一個很好的類。它非常靈活,並且可以完全控制ListView中顯示的數據。這裏有一個小例子:
public class CustomBaseAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> listData;
public CustomBaseAdapter(Context context, ArrayList<String> listData) {
this.context = context;
this.listData = listData;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.your_list_item_layout, parent, false);
//populate the view with your data -- some examples...
TextView textData = (TextView) convertView.findViewById(R.id.yourTextView);
textData.setText(listData.get(position));
ImageButton button = (ImageButton) convertView.findViewById(R.id.yourImageButton);
button.setOnClickListener(new View.OnClickListener() {
//...
//...
});
}
return convertView;
}
@Override
public Object getItem(int position) {
return 0;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getCount() {
return listData.size();
}
}
所以這段代碼的關鍵部分是明顯的getView()
方法,被稱爲每次ListView控件需要一些數據來顯示時間。爲了提高效率,視圖被存儲在一個名爲convertView
的東西中,以便它們可以被重複使用,並且不必在每次屏幕上出現視圖時都充氣。
因此,我們在getView()
中所做的工作首先要查明convertView
是否存在。如果是這樣,我們只是將它傳遞給調用的ListView,因爲所有東西都應該已經實例化並準備好了。如果convertView
爲空,則意味着數據尚未實例化(或因任何原因需要重新實例化),因此我們膨脹一個全新的視圖並使用我們的數據填充它。
在上面這個例子中適配器的情況下
所以,如果您的幾個活動的所有顯示的字符串的一個列表,你可以重複使用該適配器爲每一個,您創建了一個新的每次路過不同ArrayList<String>
通過構造目的。但是如果你有更多的數據可以顯示,你顯然可以傳遞更多的信息。複雜程度取決於您。如果你的活動之間的差異太大了,我會爲它們全部創建這個類的自定義版本,只是將它們實例化並填充它們,然而你願意。它將保持所有數據的組織和封裝。
希望這會有所幫助!如果您需要,可隨時提出問題以獲得更多解釋。
編輯迴應評論
由於您使用的是RecyclerView,而不是僅僅簡單的列表視圖(我,出於某種原因,完全忘了),你仍然可以做的非常相似使用RecyclerView.Adapter<YourViewHolder>
東西代替。區別在於,不是在getView()
方法中誇大視圖,而是在您定製的ViewHolder
內膨脹,而我假設您已擁有該視圖。代碼可能看起來像這樣:
public class CustomRecyclerViewAdapter extends RecyclerView.Adapter<StringViewHolder> {
private final List<String> items;
public CustomRecyclerViewAdapter(ArrayList<String> items) {
this.items = items;
}
@Override
public StringViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//So instead of inflating the views here or in a getView() like in
//in the BaseAdapter, you would instead inflate them in your custom
//ViewHolder.
return new StringViewHolder(parent);
}
@Override
public void onBindViewHolder(StringViewHolder holder, int position) {
holder.setModel(items.get(position));
}
@Override
public long getItemId(int position) {
return items.get(position).hashCode();
}
@Override
public int getItemCount() {
return items.size();
}
}
我很困惑你在哪裏卡住。你提供的鏈接顯示瞭如何做你想做的事情。所以也許這個問題不清楚。 – NoChinDeluxe
如果我在我的適配器中使用Onclick方法。有用。然後對於另一個活動,我必須創建另一個適配器。所以它需要5個適配器及更多。這是一個好習慣嗎? – user3467240
如果所有五項活動都是相同的數據,那麼您可以使用同一個適配器。但你爲什麼這樣做。相反,您可以使用單個活動並使用按鈕來更改視圖。 – cgr