Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为ListView传递两个变量_Java_Android_Listview_Arraylist_Listadapter - Fatal编程技术网

Java 为ListView传递两个变量

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

我正在使用Zxing扫描仪库开发一个项目QR扫描仪应用程序,我想将扫描数据输入listview。因此,我想在扫描项目后在ListView中输入ItemName和ItemPrice。为了从扫描结果(纯文本)中区分itemName和itemPrice,我使用了字符串标记器类,然后我可以分别获得itemName和Price

解决方案应该是,当用户扫描项目时,应该在列表视图中分别显示项目名称和项目价格。问题是如何使用字符串和整数来实现这个系统

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已在同一类中定义..:/