更新:エラーはもうありません! 今すぐパターン自体についてコメントしてください。長所と短所。好きなもの、嫌いなもの。修正できるもの。なぜ私がこれをしたのかまだ理解できません...教えてください(ただし、以下の私の投稿を読んでください)
私は Android の BaseAdapters の新しいデザイン パターンの作成に取り組んでいますが、これまでのところ、その結果が非常に気に入っています。
特定のタイプのコレクション内のすべてのエンティティに必要なすべてのデータを保持できるデータ構造があります。画面上でユーザーに表示される独自の UI レイアウトを使用して、特定の BaseAdapter 実装を作成しています。かなり基本的で素晴らしいアイデアです...何も新しいものではありません。
わかりました、なぜ私はこれが欲しいのですか?
これを行うことの背後にある一般的な考え方は、1) getView メソッドの実装を抽象化し、より多くのアマチュア開発者が独自のカスタム アダプターを簡単に作成できるようにすること、および 2) 可能な限り多くの詳細を簡略化および抽象化することです。
注: 最後の 2 つのコード部分では、実装する必要があるのは 3 つだけです (より理にかなっています)。現在使用されているホルダー パターンに存在する内部クラス、SetLayoutResource(...) メソッド、および ExtractLayoutResources(...) メソッド。
私がこれを欲しがり、良いと思う 3 つの主な理由は... 抽象化、抽象化、抽象化です!
ConcreteCustomAdapter.java
(具体的なコード例...これは基本的にすべてがどのように見えるかです!!! 新しいカスタム BaseAdapter を作成するために入力する必要があるのは基本的にこれだけです!!!)
public class ConcreteCustomAdapter extends BaseDataAdapter<Song, SongHolder> {
public ConcreteCustomAdapter(Context context, int resource, Song[] data) {
super(context, resource, data);
// Give the base class a reference to the actual type of Holder class to use
this.setViewHolder(new SongHolder());
}
@Override
protected void setLayoutResources(SongHolder holder, Song data) {
// Set the View Holder objects properties with the current data
holder.imgUiControl.setImageResource(data.thumbnail);
holder.txtUiControl.setText(data.Name);
}
@Override
protected void extractLayoutResources(View row, SongHolder holder) {
// Convert XML UI component definitions into the static View Holder object
holder.imgUiControl = (ImageView) row.findViewById(R.id.imgUiControl);
holder.txtUiControl = (TextView) row.findViewById(R.id.txtUiControl);
}
// Class that holds all the UI component references
static class SongHolder implements IHolder {
ImageView imgUiControl;
TextView txtUiControl;
}
}
ソング.java
(ユーザーが作成しました!)
// Entity that holds ALL the data
public class Song implements IData {
public int thumbnail;
public String Name;
...
// Constructors, Getters, Setters
...
}
コードの残りの部分はサポート目的のためのものです
IHolder.java
// Current Adapter Pattern uses Holder Objects, this represents that and the data via interface
public interface IHolder {
interface IData { }
}
BaseDataAdapter.java
(ユーザーはこれに触れないでください)
// D for Data....H for Holder (sorry not convention)
public abstract class BaseDataAdapter<D extends IData, H extends IHolder> extends BaseAdapter {
private Context context;
private int layoutResourceID;
private D data[] = null;
private H holder = null;
public BaseDataAdapter(Context context, int resource, D[] data) {
//super(context, resource, data);
this.layoutResourceID = resource;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//super.getView(position, convertView, parent);
View row = convertView;
if (row == null) {
LayoutInflater newView = ((Activity) context).getLayoutInflater();
row = newView.inflate(this.layoutResourceID, parent, false);
extractLayoutResources(row, holder);
row.setTag(holder);
} else {
holder = (H) row.getTag();
}
setLayoutResources(holder, data[position]);
return row;
}
public void setViewHolder(H holder) {
this.holder = holder;
}
abstract protected void setLayoutResources(H holder, D data);
abstract protected void extractLayoutResources(View row, H holder);
@Override
public int getCount() { return this.data.length; }
@Override
public Object getItem(int position) { return this.data[position]; }
@Override
public long getItemId(int position) { return 0; }
}