如何为 Android ListView 中的每个项目设置唯一 ID?
How to set unique ID for each Item in Android ListView?
我的代码:
JSONArray jArray = new JSONArray(result);
if(jArray.length() > 0) {
for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);
expense_id = json_data.getInt("expense_id");
client_name = json_data.getString("client_name");
expense_type = json_data.getString("expense_type");
expense_amount = json_data.getInt("expense_amount");
listItems.add(i, expense_id + "- " + client_name + " | " + expense_type + " : Rs. " + String.valueOf(expense_amount));
}
adapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,listItems);
ListView list_expenses = (ListView) findViewById(R.id.list_expenses);
list_expenses.setAdapter(adapter);
registerForContextMenu(list_expenses);
list_expenses.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view,int position, long id) {
final String item = (String) parent.getItemAtPosition(position);
final int extra_expense_id = Integer.parseInt(item.split("-")[0]);
Intent intent = new Intent(HomeScreenActivity.this, ViewExpenseActivity.class);
intent.putExtra(EXTRA_EXPENSE_ID, extra_expense_id);
startActivity(intent);
}
});
}
当我使用 onItemClick 侦听器时,我想将 'expense_id' 发送到下一个 Activity。但是如何为每个项目设置单独的 'expense_id'?
在我的代码中,我在每个项目中添加了 expense_id,然后拆分它以获得 id。但这是一种糟糕的做法。我可以为每个 listItem 设置隐藏的 ID 属性吗?
我也试过了 - listItem.add(expense_id, "String object here");这样我就可以获得等于 expense_id 的索引。
但是这项工作因为 ArrayList 必须从索引 0 开始。
可能的答案:
1 - 用户自定义适配器:不,我已经正确实现了 ArrayAdapter。
2 - 使用 setTag、getTag?这适用于整个 ListView 对象。它不适用于个别项目。
您可以将 ID 存储在单独的列表中并同时维护两者。
listItems.add(i, expense_id + "- " + client_name + " | " + expense_type + " : Rs. " + String.valueOf(expense_amount));
listIds.add(i,expense_id);
并且在您的项目点击侦听器中,您可以从位置变量中获取费用 ID
listIds.get(position);
您可以为费用 ID 创建单独的列表。
ArrayList<Integer> expenseIds = new ArrayList<Integer>();
在 for...loop 的列表中添加了 expenseId
expenseIds.add(expense_id);
你可以像下面的代码expense_id int onItemClick 方法
expenseIds.get(position);
向该行添加一个 TextView
并将其值设置为该行的 ID。
接下来,设置visibilty=gone
。
每当您需要 id 时,只需将其转换为 int
。
我的代码:
JSONArray jArray = new JSONArray(result);
if(jArray.length() > 0) {
for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);
expense_id = json_data.getInt("expense_id");
client_name = json_data.getString("client_name");
expense_type = json_data.getString("expense_type");
expense_amount = json_data.getInt("expense_amount");
listItems.add(i, expense_id + "- " + client_name + " | " + expense_type + " : Rs. " + String.valueOf(expense_amount));
}
adapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,listItems);
ListView list_expenses = (ListView) findViewById(R.id.list_expenses);
list_expenses.setAdapter(adapter);
registerForContextMenu(list_expenses);
list_expenses.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view,int position, long id) {
final String item = (String) parent.getItemAtPosition(position);
final int extra_expense_id = Integer.parseInt(item.split("-")[0]);
Intent intent = new Intent(HomeScreenActivity.this, ViewExpenseActivity.class);
intent.putExtra(EXTRA_EXPENSE_ID, extra_expense_id);
startActivity(intent);
}
});
}
当我使用 onItemClick 侦听器时,我想将 'expense_id' 发送到下一个 Activity。但是如何为每个项目设置单独的 'expense_id'?
在我的代码中,我在每个项目中添加了 expense_id,然后拆分它以获得 id。但这是一种糟糕的做法。我可以为每个 listItem 设置隐藏的 ID 属性吗?
我也试过了 - listItem.add(expense_id, "String object here");这样我就可以获得等于 expense_id 的索引。 但是这项工作因为 ArrayList 必须从索引 0 开始。
可能的答案:
1 - 用户自定义适配器:不,我已经正确实现了 ArrayAdapter。
2 - 使用 setTag、getTag?这适用于整个 ListView 对象。它不适用于个别项目。
您可以将 ID 存储在单独的列表中并同时维护两者。
listItems.add(i, expense_id + "- " + client_name + " | " + expense_type + " : Rs. " + String.valueOf(expense_amount));
listIds.add(i,expense_id);
并且在您的项目点击侦听器中,您可以从位置变量中获取费用 ID
listIds.get(position);
您可以为费用 ID 创建单独的列表。
ArrayList<Integer> expenseIds = new ArrayList<Integer>();
在 for...loop 的列表中添加了 expenseId
expenseIds.add(expense_id);
你可以像下面的代码expense_id int onItemClick 方法
expenseIds.get(position);
向该行添加一个 TextView
并将其值设置为该行的 ID。
接下来,设置visibilty=gone
。
每当您需要 id 时,只需将其转换为 int
。