web-dev-qa-db-ja.com

アダプタクラスのデータが変更されたら、アクティビティのテキストビューを更新します

ダッシュボードアクティビティにtextviewtxtQuantityがあります。販売された製品を含むカスタムアダプタ用に別のクラスを作成しました。

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dashboard);

    list = (ListView) findViewById(R.id.listSoldItems);

    txtAmount = (TextView) findViewById(R.id.txtAmount);
    txtItems = (TextView) findViewById(R.id.txtItems);

    // init listview
    adapter = new Sold_item_adaptor(Dashboard.this, soldItemsList);
    list.setAdapter(adapter);

アダプターを使用してリストからアイテムを削除できます。アイテムを削除するためのコードは、アダプタクラスで記述されています。

public View getView(final int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    if (convertView == null)
        vi = inflater.inflate(R.layout.list_row_sold_item, null);

    TextView txtListItem = (TextView) vi.findViewById(R.id.txtListItem);
    final TextView txtQuantity = (TextView) vi.findViewById(R.id.txtQuantity);
    ImageView imgCancel = (ImageView) vi.findViewById(R.id.imgCancel);

    HashMap<String, String> mapData = new HashMap<String, String>();
    mapData = data.get(position);

    txtListItem.setText(mapData.get("product"));
    txtQuantity.setText(mapData.get("qty"));

    imgCancel.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            doButtonOneClickActions(txtQuantity, position);
        }
    });

    return vi;
}

private void doButtonOneClickActions(TextView txtQuantity, int rowNumber) {
    // Do the actions for Button one in row rowNumber (starts at zero)
    data.remove(rowNumber);
    notifyDataSetChanged();

}

ダッシュボードアクティビティでは、選択したアイテムの数、合計金額を維持しています。リストビューからアイテムを削除すると、カスタムアダプターのコードでアイテムが削除されますが、ダッシュボードアクティビティで通知/シグナルを取得して数量を更新するにはどうすればよいですか。

9
Paritosh

単純なコールバックを提供する。

これを機能させるには、アダプタに簡単なインターフェイスを記述します

public interface OnDataChangeListener{
    public void onDataChanged(int size);
}

リスナーのセッターを追加します(アダプターにも)

OnDataChangeListener mOnDataChangeListener;
public void setOnDataChangeListener(OnDataChangeListener onDataChangeListener){
    mOnDataChangeListener = onDataChangeListener;
}

次に、アダプターの次のブロックにコードを追加します

private void doButtonOneClickActions(TextView txtQuantity, int rowNumber) {
    ...
    if(mOnDataChangeListener != null){
        mOnDataChangeListener.onDataChanged(data.size());
    }
}

ダッシュボードアクティビティで、リスナーを登録する必要があります

protected void onCreate(Bundle savedInstanceState) {
    ...
    adapter.setOnDataChangeListener(new Sold_item_adaptor.OnDataChangeListener(){
        public void onDataChanged(int size){
            //do whatever here
        }
    });
}

それについてです;)。

31
Julian Pieles

主なアイデアは次のとおりです。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard);

list = (ListView) findViewById(R.id.listSoldItems);

txtAmount = (TextView) findViewById(R.id.txtAmount);
txtItems = (TextView) findViewById(R.id.txtItems);

// init listview
adapter = new Sold_item_adaptor(Dashboard.this, soldItemsList,txtAmount);
list.setAdapter(adapter);

アダプター内:

public class MyAdapter extends ArrayAdapter<SoldItemsList > {

private Context context;
private mTotalQty;
private TextView mTxtAmountAdapter;


 public OfferAdapter(Context context, int resource,SoldItemsList object,TextView txtAmount ) {
    super(context, resource, objects);
    this.context = context;
    this.mTxtAmountAdapter = txtAmount;


}

//...

imgCancel.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
    doButtonOneClickActions(position);
    // update totalAmount
     mTxtAmountAdapter.setText(Integer.valueOf(totalAmount).toString()));

}
});

imgPlus.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
    qtyClickAction(position);
     // update totalQty
    mTxtAmountAdapter.setText(Integer.valueOf(totalAmount).toString()));

}
});
10
mmlooloo

アダプタークラスのnotifyDataSetChanged()をオーバーライドします...そしてあなたがやりたいことを何でもします...

@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
   // Your code to nofify
}
1
Sabeer Mohammed

私が質問を理解しているので、doButtonOneClickActions()の後にアダプターの外部でUIを更新する方法に興味があります。

最も簡単な方法は、 https://github.com/greenrobot/EventBus を使用することです。

例はここにあります http://awalkingcity.com/blog/2013/02/26/productive-Android-eventbus/

これを行いたくない場合は、コールバックを作成できます http://Android-er.blogspot.dk/2013/09/implement-callback-function-with.html

0
cYrixmorten