0

ListView各アイテムとして保持したいのでView、独自に作成しArrayAdapterました。つまり、 myはではなく nowListViewのリストです。ViewTextView

しかし、今、どのようにアイテムを管理できListViewますか? たとえば、ビューの背景色を変更したい場合setBackgroundColor(Color.BLACK)、 のコンストラクター内に配置すると機能しませんView

これは私のカスタム ArrayAdapter コードです:

public class DataViewAdapter extends ArrayAdapter<DataView>{
Context context;
int layoutResourceId;
ArrayList<DataView> views;


public DataViewAdapter(Context context, int layoutResourceId,
        ArrayList<DataView> views) {
    super(context, layoutResourceId, views);
    this.context = context;
    this.layoutResourceId = layoutResourceId;
    this.views = views;
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
    View row = convertView;
    ViewHolder holder = null;
    if(row == null){
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.view = (View)row.findViewById(R.id.dataView);
        row.setTag(holder);
    } else {
        holder = (ViewHolder)row.getTag();
    }
    DataView dataView = views.get(position);
    holder.view = dataView;
    return row;
}

static class ViewHolder{
    public View view;
}

}

また、それぞれに異なるデータ値を渡す必要がある場合はどうすればよいViewですか? 新しいデータ値を受け入れると、onDraw(Canvas canvas)my 内のメソッドDataViewがトリガーされる必要があります。

編集:コードDataView

public class DataView extends View{
    private LinkedList<Integer> data;
    public DataView(Context context){
        super(context);
        data = new LinkedList<Integer>();
    }
    public void onDraw(Canvas canvas){
    // I need to plot according to data
    }
    public void pushData(int value){
        data.add(value);
        this.invalidate();
    }
}
4

2 に答える 2

0

ListView の仕組みを理解する必要があります。単にビューの配列があるだけではありません。ユーザーがメモリを確保するために上下にスクロールすると、これらのビューが再利用されます。あなたがする必要があるのは、ロジックをAdapter#getView メソッドに入れ、そこで背景、フォントなどをリセットすることです。

もちろん、コードを追加するにはアダプタを拡張する必要があります。また、Holder パターンを使用してビューの要素への参照を保存することをお勧めします。これにより、これらを何度も検索する必要がなくなります。これは、あなたがそれを行う方法の例です

編集: コード スニペットに基づいて - ホルダー パターンを正しく使用していません。リストアイテムビューが LinearLayout だとすると、ホルダーコンストラクターで次のようなことを行います

this.title = (TextView)view.findViewById(R.id.title);

次に、Adapter#getView次のようなことができます

View getView(int position, View view, ViewGroup parent) {
    ViewHolder holder = null;
    if(row == null){
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        view = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder(view);
        view.setTag(holder);
    } else {
        holder = (ViewHolder)view.getTag();
    }
    // MyData is one piece of data in the backing array
    MyData data = (MyData)getItem(position); 
    if (data.important) {
        view.setBackground(Color.red);
        holder.title.setText(data.title);
    }
    return view;
}
于 2012-11-13T20:13:32.000 に答える
0

通常getView()、アダプターのメソッドでビューを作成/スタイル設定します (おそらく、のBaseAdapter代わりにクラスを拡張する必要がありArrayAdapterます。しかし、見よ! アイテム ビューの背景の処理は、非常に特別な章です。詳細については、次の質問/回答を参照してください。

于 2012-11-13T20:15:30.860 に答える