0

我有一个每分钟同步数据的服务。当修改/创建数据时,我会向我的 Activity 发送广播以更新我的 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

在不知道其位置的情况下,您无法删除任何项目。

一种不可行但有效的解决方案是:接收到广播后,重新创建所有内容。这意味着,无论哪个部分正在更新,刷新该部分并再次使用新值创建它。

例如:如果您的列表正在更新,请从列表中删除所有项目,然后添加所有新值,并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只需调用此方法即可。它比你想象的要快得多。

更新: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或类似的东西,纯硬编码的java。我很确定这确实有效,如果它在您的示例中不起作用,我会建议您调试并确保一切正常,因为我猜您的代码还有其他问题,而不是适配器没有填充.

于 2012-07-24T14:19:55.420 回答
0

所以我是根据我的问题提出的,但你不会喜欢它。在我看来,最好的方法是实际使用 aCursorAdapterCursorLoader刷新数据库中的内容。所以你基本上不必做这项工作。从网络获取信息并更新数据库后,您只需刷新适配器即可反映新信息。在您的情况下,您无法在ListView不知道其归属的情况下更改任何内容。但是用我刚才告诉你的方法,你ListView可以setAdapter()按住 ,CursorAdapter然后你可以刷新它。但这需要对代码进行一些修改。

于 2012-07-24T14:23:19.677 回答