2

商品のリスト(ショッピングリストなど)を使用して、商品のユニット数を選択できるアクティビティがあります。

アクティビティには、TextWatcherを使用したEditTextと、パーソナルアダプタを使用したListView(BaseAdapterを拡張)が含まれます。

EditTextにキーを入力すると、製品のlistViewが新しいデータで更新されます。

ただし、選択したデータの状態を保持したいと思います。

たとえば、EditTextに参照を入力し、listViewに3つのデータ(A、B、C)が含まれ、Aを選択し、その5単位を入力してから、EditTextに新しい参照を入力します(AとBが消えます)。 )。

listViewにはCのみが含まれていますが、検索を削除してA、B、Cに戻ります。

問題は、製品Aが選択されておらず、ユニット数が0である(5ユニットが消えている)ことです。

EditTextで検索を変更しても、選択した製品と単位を保持したい。

どうすればいいですか?

コードスニペットは次のとおりです。

アクティビティのレイアウト:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText  
        android:id="@+building_list/search_box" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Filter by reference"
        android:inputType="textAutoCorrect|none|textAutoComplete|none|textNoSuggestions"
        android:maxLines="1"
        android:textSize="20dp" />

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="10dp"
        android:id="@+id/productListView">
    </ListView>
</LinearLayout>

アダプター:

public class AdapterProduct extends BaseAdapter {   
    private List<Product> lstProduct;
    private LayoutInflater mInflater;

    public AdapterProduct(Context context, List<Product> listP) {
        lstProduct = listP;
        mInflater = LayoutInflater.from(context);
        }

public View getView(int position, View convertView, ViewGroup parent) {
        CheckedLinearLayout layoutItem;

        if (convertView == null) {      
            layoutItem = (CheckedLinearLayout) mInflater.inflate(R.layout.row_product, parent, false);
            final ViewHolderProduct viewHolder;
            viewHolder = new ViewHolderProduct();

            viewHolder.btPlusAmount = (Button)layoutItem.findViewById(R.id.btPlusAmount);
            viewHolder.btPlusAmount.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Product p = (Product) viewHolder.product.getTag();
                    p.setAmount(p.getAmount()+1);
                    notifyDataSetChanged();
                }
            });
        }
        else {
            layoutItem = (CheckedLinearLayout) convertView;
            ((ViewHolderProduct) layoutItem.getTag()).btPlusAmount.setTag(lstProduct.get(position));
        }

        ViewHolderProduct viewHolder = (ViewHolderProduct) layoutItem.getTag();
        viewHolder.amount.setText(String.valueOf(lstProduct.get(position).getAmount()));
}

static class ViewHolderProduct {
    protected TextView amount;
    protected Button btPlusAmount;
}
}

そして、TextWatcherを使用したAsyncTask:

AsyncTask
doInBackground =>
    modelProduct = new AdapterProduct(leContext, 
                        ProductJSON.getService().searchProducts(leContext, url, params[0])); //params[0] = the text of EditText


private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {

    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {

        //AsyncTask task
        task.execute(s.toString());
    }
};
4

1 に答える 1

0

ここで私の答えを確認させてください。

1)基本的に、アダプタに新しい属性を追加します。単純なint[]で十分です。選択した製品の数を内部に保存します。

2)の行のビューを作成するたびに、ListView選択した製品の数を確認します。

3)ボタンをクリックしたときに選択した製品の数を必ず更新してください。また、リストが変更された場合は、必ずこの配列のサイズを変更/更新してください。製品をクリックするたびにnotifyDataSetChanged()を呼び出します。

于 2013-03-06T15:45:43.107 に答える