0

毎分データを同期するサービスがあります。データが変更/作成されると、ListView を更新するためにアクティビティにブロードキャストを送信します。

ビューを更新するには、ビューを削除して正しい値で再作成したいのですが、その位置がわからず、textViews のコンテンツしか持っていません。

アクティビティ :

public void onCreate{
...
this.registerReceiver(this.updateListReceiver, new IntentFilter(
            "com.android.updatelist"));
}

BroadcastReceiver updateListReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

        String id = intent.getExtras().getString("AccountId");
        String name = intent.getExtras().getString("AccountName");
        boolean isNew = intent.getExtras().getBoolean("isNew");

        if (isNew) {
            Account accountInList = new Account(id, name, null, null, null,
                    null);
            adapter.add(accountInList);
        } else {

        }
    }
};

サービス :

Intent intent = new Intent();
                                intent.setAction("com.android.updatelist");
                                intent.putExtra("AccountId",
                                        updatedAccount.getAccountId());
                                intent.putExtra("AccountName",
                                        updatedAccount.getName());
                                intent.putExtra("isNew", true);
                                sendBroadcast(intent);

アダプター:

public class AccountNameListAdapter extends ArrayAdapter<Account> {

private final Context context;
private final int layoutResourceId;
private final ArrayList<Account> data;
private final TableLayout table;
private final TextView tableName;
private final TextView tableIndustry;
private final TextView tablePhone;
private final TextView tableWebsite;
final AccountBDD accountBdd;

public AccountNameListAdapter(Context context, int layoutResourceId,
        ArrayList<Account> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
    table = (TableLayout) ((Activity) context)
            .findViewById(R.id.tableLayout);
    tableName = (TextView) ((Activity) context).findViewById(R.id.NameText);
    tableIndustry = (TextView) ((Activity) context)
            .findViewById(R.id.IndustryText);
    tablePhone = (TextView) ((Activity) context)
            .findViewById(R.id.PhoneText);
    tableWebsite = (TextView) ((Activity) context)
            .findViewById(R.id.WebsiteText);

    accountBdd = SQLiteApplication.getAccountBdd();

}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    AccountHolder holder = null;

    if (convertView == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId, parent, false);

        holder = new AccountHolder();

        convertView.setClickable(true);
        convertView.setFocusable(true);

        holder.txtName = (TextView) convertView.findViewById(R.id.nom);
        holder.txtId = (TextView) convertView.findViewById(R.id.id);

        convertView.setTag(holder);

    } else {
        holder = (AccountHolder) convertView.getTag();
    }

    convertView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            table.setVisibility(0);

            String id = data.get(position).getAccountId();
            Account displayAccount = accountBdd.getAccountWithAccountID(id);

            tableName.setText(displayAccount.getName());
            tableIndustry.setText(displayAccount.getIndustry());
            tablePhone.setText(displayAccount.getPhone());
            tableWebsite.setText(displayAccount.getWebsite());
        }

    });

    holder.txtName.setText(data.get(position).getName());
    holder.txtId.setText(data.get(position).getAccountId());

    ImageButton img = (ImageButton) convertView.findViewById(R.id.check);
    img.setTag(position);

    return convertView;
}

static class AccountHolder {
    TextView txtName;
    TextView txtId;
}

}

どうすればいいですか?

4

3 に答える 3

0

だから私はこれを私の質問に基づいていますが、あなたはそれを気に入らないでしょう. 私の意見では、これを行う最善の方法は、データベース内の内容を更新する aCursorAdapterとともに実際に使用することです。CursorLoaderそのため、基本的に作業を行う必要はありません。ネットワークから情報を取得してデータベースが更新されたら、アダプターを更新するだけで新しい情報が反映されます。あなたの場合、ListViewどこにあるのかわからないまま何も変更することはできません。しかし、先ほどお伝えした方法で、ListViewsetAdapter()を保持し、CursorAdapterリフレッシュするだけで済みます。ただし、コードの修正が必要になります。

于 2012-07-24T14:23:19.677 に答える
0

位置を知らずにアイテムを削除することはできません。

現実的ではないが効果的な解決策の 1 つは、ブロードキャストを受信した後、すべてを再作成することです。つまり、どの部分が更新されても、その部分をフラッシュして、新しい値で再度作成します。

例: リストが更新されている場合、リストからすべての項目を削除してから、すべての新しい値を追加し、notifyDataSetChangeアダプターでメソッドを呼び出します。

于 2012-07-24T14:13:08.573 に答える
0

account_id を入力として受け取るアダプターでメソッドを作成します。次のようになります。

private void deleteData(int account_id) {
   for(int i=0; i<data.size(); i++) {
      //search for the id and delete it from the data
   }
   notifyDatasetChanged();
}

受け取ったアクティビティからBroadcastReceiverこのメソッドを呼び出すだけでOKです。あなたが思っているよりもはるかに速いです。

更新:Accountはオブジェクトです。アドレス メモリは常に変化するため、削除はそのようには機能しません。

データの中から正確なオブジェクトの位置を見つけて、data.remove(position) を試してみてください。getAccountByID(int accountid)これを実装する代わりに、このようなもの:

private int getPositionFromID(int accountid) {
   for(int i=0; i<data.size(); i++) {
       if(data.get(i).getAccountID() == accountID)
           return i; //if you have a match
   }
   return -1; //error code, that is not found
}

次に、位置を使用して正確なスポットを削除します。

private void deleteData(int account_id) {
   int position = getPositionFromID(int accountid);
   if(position == -1) {
      //handle error
   } else {
      data.remove(position); 
      notifyDatasetChanged();
   }
}

はい、どうぞ!これで、完全なコピーと貼り付けの例ができました! 私は何度もそれを行ってきました。台無しにする必要はありませんCursorAdapter。これが実際に機能すると確信しています。あなたの例で機能しない場合は、デバッグしてすべてが問題ないことを確認することをお勧めします. .

于 2012-07-24T14:19:55.420 に答える