1

Google Keepに似た UI を作成しようとしています。Recycler View を使用してずらした View を作成する方法を知っています。特定のカードをクリックすると。次に、アクティビティを開く必要があります。

onclick メソッドを使用してこれを実現できます。

これと同じシナリオが、アプリ内の少なくとも 5 つの異なるアクティビティで発生します。

私の質問はそれです

  1. この 1 つのアダプターを 5 つの場所すべてで使用できますか?

    1. はいの場合、onclick アクションをどこに配置すればよいですか?

    2. いいえの場合、Keep のようなずらしたレイアウトを作成するにはどうすればよいですか?

前もって感謝します!

4

1 に答える 1

-1

(以下の編集で RecyclerView のアプリケーションを参照してください)

コメントで述べたように、異なるデータとビューを使用するすべてのアクティビティに対して個別のアダプターを使用することは確かに問題ありません。アプリのデータとレイアウトが複雑になるにつれて、コードも複雑になります...それはまさにその通りです。

ただし、一部のアクティビティが ListView で同様のデータを使用している場合 (たとえば、2 つの TextView と 1 つの ImageButton など)、複数のアクティビティに使用できる単一のアダプターを定義することで、労力を節約できます。ArrayAdapter<String>次に、複数のオブジェクトを作成して複数の ListView に入力するのと同様に、アクティビティごとに個別のオブジェクトをインスタンス化します。

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 に戻すだけです。これは、すべてが既にインスタンス化され、準備が整っているはずだからです。が nullの場合convertView、データがインスタンス化されていない (または何らかの理由で再インスタンス化する必要がある) ことを意味するため、新しいビューを拡張してデータを入力します。

したがって、上記のアダプターの例の場合、いくつかのアクティビティーがすべて単一の文字列リストを表示する場合ArrayList<String>、新しいオブジェクトを作成するたびにコンストラクターを介して異なるアダプターを渡し、それぞれにこのアダプターを再利用できます。しかし、表示するデータがさらにある場合は、文字列以外のものを渡すことができることは明らかです。複雑さのレベルはあなた次第です。アクティビティ間の違いが大きすぎる場合は、すべてのアクティビティに対してこのクラスのカスタム バージョンを作成し、それらをインスタンス化して、好きなように設定します。これにより、すべてのデータが非常に整理され、カプセル化された状態に保たれます。

お役に立てれば!必要に応じて、さらに明確にするために質問してください。


コメントに応じて編集

単純な ListViews の代わりに RecyclerView を使用しているため (何らかの理由で完全に忘れていました)、RecyclerView.Adapter<YourViewHolder>代わりに a を使用して非常に似たようなことを行うことができます。違いは、ビューをgetView()メソッド内で膨張させるのではなく、 custom 内で膨張させる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();
    }
}
于 2015-12-11T15:58:50.730 に答える