Java 为ListView传递两个变量
我正在使用Zxing扫描仪库开发一个项目QR扫描仪应用程序,我想将扫描数据输入listview。因此,我想在扫描项目后在ListView中输入ItemName和ItemPrice。为了从扫描结果(纯文本)中区分itemName和itemPrice,我使用了字符串标记器类,然后我可以分别获得itemName和Price 解决方案应该是,当用户扫描项目时,应该在列表视图中分别显示项目名称和项目价格。问题是如何使用字符串和整数来实现这个系统Java 为ListView传递两个变量,java,android,listview,arraylist,listadapter,Java,Android,Listview,Arraylist,Listadapter,我正在使用Zxing扫描仪库开发一个项目QR扫描仪应用程序,我想将扫描数据输入listview。因此,我想在扫描项目后在ListView中输入ItemName和ItemPrice。为了从扫描结果(纯文本)中区分itemName和itemPrice,我使用了字符串标记器类,然后我可以分别获得itemName和Price 解决方案应该是,当用户扫描项目时,应该在列表视图中分别显示项目名称和项目价格。问题是如何使用字符串和整数来实现这个系统 StringTokenizer tokenizer = ne
StringTokenizer tokenizer = new StringTokenizer(scanRes, ":");
itmName = tokenizer.nextToken();
itmPrice = Integer.valueOf(tokenizer.nextToken());
我通过这个语句将结果传递给字符串名“scanRes”(上面提到的代码)
qrResult.setText(intent.getStringExtra("SCAN_RESULT"));
String scanRes = intent.getStringExtra("SCAN_RESULT");
我想在ListView中查看上面提到的两个变量(itmName和itmPrice)中的赋值。我已经实现了一个解决方案,它需要字符串数组来传递值。我需要传递保存在这两个变量中的值。我将在下面发布我创建的解决方案。如果有人能告诉我代码中需要更改的内容,我将非常感谢
这是扫描仪活动类的代码。它给底部的“onItemClick”方法带来了一个错误
public class QRScanMenu extends Activity {
String itmName;
Integer itmPrice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.qrscannermenu);
HandleClick handleClick = new HandleClick();
findViewById(R.id.QRButton).setOnClickListener(handleClick);
findViewById(R.id.ExitButton).setOnClickListener(handleClick);
}
private class HandleClick implements View.OnClickListener{
public void onClick(View arg0){
try{
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
switch (arg0.getId()){
case R.id.QRButton:
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
break;
case R.id.ExitButton:
Intent i = new Intent(QRScanMenu.this, MainActivity.class);
startActivity(i);
break;
}
startActivityForResult(intent, 0);
}
catch (ActivityNotFoundException ex){
showDialog(QRScanMenu.this, "No Scanner Application Found", "Download Scanner Application?", "Yes", "No").show();
}
}
}
private static AlertDialog showDialog(final Activity activity, CharSequence title, CharSequence message, CharSequence btnYes, CharSequence btnNo){
AlertDialog.Builder downloadDialog = new AlertDialog.Builder(activity);
downloadDialog.setTitle(title);
downloadDialog.setTitle(message);
downloadDialog.setPositiveButton(btnYes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri uri = Uri.parse("market://search?q=pname:" + "com.google.zxing.client.android");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try {
activity.startActivity(intent);
} catch (ActivityNotFoundException ex) {
}
}
});
downloadDialog.setNegativeButton(btnNo, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
return downloadDialog.show();
}
public void onActivityResult(int reqCode, int resCode, Intent intent){
if (reqCode == 0){
TextView qrStatus = (TextView) findViewById(R.id.statusText);
TextView qrResult = (TextView) findViewById(R.id.resultText);
ListView listView = (ListView) findViewById(R.id.qrItmList);
if(resCode == RESULT_OK){
qrStatus.setText(intent.getStringExtra("SCAN_RESULT_FORMAT"));
qrResult.setText(intent.getStringExtra("SCAN_RESULT"));
String scanRes = intent.getStringExtra("SCAN_RESULT");
StringTokenizer tokenizer = new StringTokenizer(scanRes, ":");
itmName = tokenizer.nextToken();
final String[] newd = new String[1];
newd[1]=itmName;
itmPrice = Integer.valueOf(tokenizer.nextToken());
Integer[] newI = new Integer[1];
newI[1]=itmPrice;
customList adapter = new customList(QRScanMenu.this, newd, newI);
listView.setAdapter(adapter);
listView.setOnClickListener(new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
Toast.makeText(QRScanMenu.this, "You Clicked at "+newd, Toast.LENGTH_SHORT).show();
}
});
//adapter.add(itmName);
//adapter.add(itmPrice);
}
else if (resCode == RESULT_CANCELED){
qrStatus.setText("Press QR Scan button to Scan Item");
qrResult.setText("Scan Cancelled");
}
}
}
}
此代码用于列表
public class customList extends ArrayAdapter<String> {
private final Activity context;
private final String[]itmName;
private final Integer[]itmPrice;
public customList(Activity context, String[]itmName, Integer[]itmPrice){
super(context, R.layout.columnview, itmName);
this.context = context;
this.itmName = itmName;
this.itmPrice = itmPrice;
}
@Override
public View getView(int position, View view, ViewGroup parent){
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.columnview, null, true);
TextView txtViewName = (TextView) rowView.findViewById(R.id.itmCol);
TextView txtViewPrice = (TextView) rowView.findViewById(R.id.priceCol);
txtViewName.setText(itmName[position]);
txtViewPrice.setText(itmPrice[position]);
return rowView;
}
}
公共类customList扩展了ArrayAdapter{
私人最终活动背景;
私有最终字符串[]itmName;
私有最终整数[]itmPrice;
公共自定义列表(活动上下文,字符串[]itmName,整数[]itmPrice){
super(context,R.layout.columnview,itmName);
this.context=上下文;
this.itmName=itmName;
this.itmPrice=itmPrice;
}
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图){
LayoutInflater充气器=上下文。getLayoutInflater();
视图行视图=充气机。充气(R.layout.columnview,null,true);
TextView txtViewName=(TextView)rowView.findViewById(R.id.itmCol);
TextView txtViewPrice=(TextView)rowView.findViewById(R.id.priceCol);
txtViewName.setText(itmName[position]);
setText(itmPrice[位置]);
返回行视图;
}
}
这是columnView.XML的XML代码
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TableRow>
<TextView
android:id="@+id/itmCol"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_weight="1"
android:textStyle="bold" />
<TextView
android:id="@+id/priceCol"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_weight="1"
android:textStyle="bold"/>
</TableRow>
这是QR扫描仪活动类的代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/linLayout1">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/QRButton"
android:text="QR Scan"
android:textSize="18sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ExitButton"
android:text="Back Main"
android:textSize="18sp"/>
</LinearLayout>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/statusText"
android:layout_below="@+id/linLayout1"
android:text="Press QR Scan Button to Scan Items"
android:textSize="18sp"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/resultText"
android:text="Ready to Scan"
android:textSize="18sp"
android:layout_below="@+id/statusText"
android:background="@android:color/white"
android:textColor="@android:color/black"/>
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/qrItmList"
android:layout_below="@+id/resultText"
android:layout_centerHorizontal="true">
</ListView>
首先,您需要创建一个新对象来保存两个项目
public class Product {
String name;
int price;
}
然后为您的项目制作一个ArrayAdapter
public class MyAdpater extends ArrayAdapter<Product> {
private final Activity context;
public customList(Activity context, Product[] products){
super(context, R.layout.columnview, products);
this.context = context;
}
@Override
public View getView(int position, View view, ViewGroup parent){
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.columnview, null, true);
TextView txtViewName = (TextView) rowView.findViewById(R.id.itmCol);
TextView txtViewPrice = (TextView) rowView.findViewById(R.id.priceCol);
txtViewName.setText(getItemAtPosition(position).name);
txtViewPrice.setText(String.valueOf(getItemAtPosition(position).price]));
return rowView;
}
}
公共类MyAdpater扩展了ArrayAdapter{
私人最终活动背景;
公共自定义列表(活动上下文,产品[]产品){
super(上下文、R.layout.columnview、产品);
this.context=上下文;
}
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图){
LayoutInflater充气器=上下文。getLayoutInflater();
视图行视图=充气机。充气(R.layout.columnview,null,true);
TextView txtViewName=(TextView)rowView.findViewById(R.id.itmCol);
TextView txtViewPrice=(TextView)rowView.findViewById(R.id.priceCol);
setText(getItemAtPosition(position).name);
txtViewPrice.setText(String.valueOf(getItemAtPosition(position.price));
返回行视图;
}
}
您的OnClick侦听器将是:
listView.setOnClickListener(new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<Product> parent, View view, int position, long id){
Toast.makeText(QRScanMenu.this, "You Clicked at "+ parent.getItemAtPosition(position).name, Toast.LENGTH_SHORT).show();
}
});
listView.setOnClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Toast.makeText(QRScanMenu.this),您在“+parent.getItemAtPosition(position).name,Toast.LENGTH_SHORT.show()处单击过它”;
}
});
我在代码中看不到列表项的任何自定义xml。
为列表视图项创建自定义xml。然后用充气机给它充气
final String[] newd = new String[1];
newd[1]=itmName;
字符串数组的大小为1,但arrayindex以0开头。您正在将itmName添加到第一个位置
itmPrice = Integer.valueOf(tokenizer.nextToken());
Integer[] newI = new Integer[1];
newI[1]=itmPrice;
整数数组的大小为1,但arrayindex以0开头。您正在将newI添加到第一个位置
itmPrice = Integer.valueOf(tokenizer.nextToken());
Integer[] newI = new Integer[1];
newI[1]=itmPrice;
显然,您将获得ArrayIndexOutofboundsException 您可以创建一个
项
类并修改适配器以扩展阵列适配器
发布您遇到的错误。我已经更新了问题。您尝试过我的答案吗?错误是?
应该是字符串
,但当您试图在匿名类中使用局部变量时,会出现另一个错误。@RobVoisey好的,给我一分钟。.我会尝试并告诉您!!感谢她在这一行中这样做View rowView=inflater.inflate(R.layout.columnview,null,true)
Downvoted as没有解决这个问题。我已经在QR ScanMenu类中定义了两个变量。。我必须创建另一个类并定义它吗???@Miuranga如果你已经有了另一个类和这两个类,你可以用那个类代替。是的,我已经在使用它们了。。我能知道为什么onClickItem方法中出现错误吗?我之前回答过:“错误是?应该是字符串,但是当您试图在匿名类中使用局部变量时,您会遇到另一个错误。”。除非有新的错误?我将“?”标记替换为字符串bt,它给出了相同的错误。。无论如何,itmName和itmPrice已在同一类中定义..:/