android - 反射(reflect)在其他 ListView 子布局中的 ListView 的一个子布局的更改

标签 android listview layout-inflater

我创建了一个展开布局的 ListView 。膨胀的布局有一个 edittext 和两个按钮,用于增加和减少 edittext 中的值。但问题是,如果我更改 ListView 中第一个编辑文本的值,更改会反射(reflect)在 ListView 的第四个编辑文本(第四个子项)中。同样,第二个 edittext 的变化反射(reflect)到第五个 edittext 等等。我编写的用于在 ListView 中扩充布局的代码如下所示。请帮助我解决问题。

public class DisplayList extends AppCompatActivity {

private static final String TAG_CATEGORY = "main_name";
private static final String TAG_SUBCAT = "cat_name";
private static final String TAG_CODE = "code";
private static final String TAG_NAME = "name";
private static final String TAG_RATE = "rate";
private static final String TAG_RATE2 = "rate2";
private static final String TAG_RATE3 = "rate3";
private static final String TAG_IMAGE = "img";

ImageAdapter mImageAdapter = null;
ListView mListView = null;
DatabaseHelper myDb;
FloatingActionButton fab1;

public  ArrayList<DetailsVO> mListDetails = new ArrayList<DetailsVO>();

String subc;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_list);

    myDb=new DatabaseHelper(DisplayList.this);

    fab1 = (FloatingActionButton) findViewById(R.id.fab);
    fab1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent=new Intent(DisplayList.this,NewCart.class);
            startActivity(intent);
        }
    });

    mListView = (ListView) findViewById(R.id.list_view);

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        subc = extras.getString("Subcat");
    }

    new AsyncCallSoap1().execute();



}

public class AsyncCallSoap1 extends AsyncTask<String,Void,String> {
    private final ProgressDialog dialog=new ProgressDialog(DisplayList.this);

    @Override
    protected String doInBackground(String... params) {
        CallSoap com=new CallSoap();
        String SOAP_ACTION="http://tempuri.org/IprotechService/SelectSuCatgeory";
        String OPERATION_NAME="SelectSuCatgeory";
        String response = com.getDetails(OPERATION_NAME,SOAP_ACTION);

        if(response!=null){
            try {

                JSONArray array1 = new JSONArray(response);

                for(int i=0;i<array1.length();i++)
                {

                    final DetailsVO detailsVO = new DetailsVO();
                    JSONObject obj1 = array1.getJSONObject(i);

                    String out_category = obj1.getString(TAG_CATEGORY);
                    String out_subcat = obj1.getString(TAG_SUBCAT);
                    String out_code = obj1.getString(TAG_CODE);
                    String out_name = obj1.getString(TAG_NAME);
                    String out_rate = obj1.getString(TAG_RATE);
                    String out_rate2 = obj1.getString(TAG_RATE2);
                    String out_rate3 = obj1.getString(TAG_RATE3);
                    String out_img = obj1.getString(TAG_IMAGE);

                    if(subc.equalsIgnoreCase(out_subcat)){
                        detailsVO.setImage(out_img);
                        detailsVO.setName(out_name);
                        detailsVO.setRate(out_rate);
                        detailsVO.setRate2(out_rate2);
                        detailsVO.setRate3(out_rate3);

                        mListDetails.add(detailsVO);}
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return response;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Showing progress dialog
        dialog.setMessage("Please wait...");
        dialog.setCancelable(false);
        dialog.show();
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        dialog.dismiss();

        if(mListDetails != null){
            mImageAdapter = new ImageAdapter(DisplayList.this, mListDetails);
            mListView.setAdapter(mImageAdapter);

        }

    }
}

public class ImageAdapter extends BaseAdapter {
    private Context mContext;
    private ArrayList<DetailsVO> mItems;
    private ArrayList<DetailsVO> mOriginalItems;


    public ImageAdapter(Context context, ArrayList<DetailsVO> items) {
        this.mContext = context;
        this.mItems = items;
    }

    @Override
    public int getCount() {
        return mItems.size();
    }

    @Override
    public DetailsVO getItem(int position) {
        return mItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public ArrayList<DetailsVO> getItems(){
        return mItems;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.row_layout, null);

        }

        DetailsVO detailsVO = mItems.get(position);

        View listView = (View) convertView;

        ImageView image = (ImageView) listView.findViewById(R.id.imageView2);

        final TextView textTitle = (TextView) listView.findViewById(R.id.textView2);

        final Spinner spinner=(Spinner) listView.findViewById(R.id.spinner);

        Button btnplus = (Button) listView.findViewById(R.id.max);
        Button btnminus = (Button) listView.findViewById(R.id.min);
        final Button btnadd=(Button) listView.findViewById(R.id.btn_add);
        btnadd.setClickable(true);

        final TextView quantity = (TextView) listView.findViewById(R.id.quantity);

        ArrayList<String> rate=new ArrayList<String>();

        rate.add("Rs."+detailsVO.getRate());
        if(detailsVO.getRate2()!= null && !detailsVO.getRate2().isEmpty())
        {
            rate.add("Rs."+detailsVO.getRate2());
        }
        if(detailsVO.getRate3()!= null && !detailsVO.getRate3().isEmpty())
        {
            rate.add("Rs."+detailsVO.getRate3());
        }
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(DisplayList.this, android.R.layout.simple_spinner_item,rate);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);


        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String item = parent.getItemAtPosition(position).toString();

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        btnminus.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                String value = quantity.getText().toString();
                int quantity1 = Integer.parseInt(value);

                if(quantity1>0)
                {
                    quantity1 = quantity1 -1;

                    String t = Integer.toString(quantity1);
                    quantity.setText(t);
                }
            }
        });


        btnplus.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                String value1 = quantity.getText().toString();
                int quantity2 = Integer.parseInt(value1);
                quantity2 = quantity2 + 1;

                String t=Integer.toString(quantity2);

                quantity.setText(t);
                   }
        });

        final  String u=detailsVO.getImage();
        btnadd.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                String im="http://protech.absoftwaresolution.com/img/grocery_imgs/grains/"+u;
                String nm = textTitle.getText().toString();
                String value = quantity.getText().toString();
                int q= Integer.parseInt(value);

                String rate=spinner.getSelectedItem().toString();
                String val = rate.substring(rate.lastIndexOf("-")- 1);
                final String val1=rate.substring(3,rate.lastIndexOf("-"));
                int b = Integer.parseInt(val1.trim());
                final int  a= q*b;
                String c=Integer.toString(a);

                boolean isInserted = myDb.insertData(im,nm,val1,q,a);
                if (isInserted == true) {
                    Toast.makeText(DisplayList.this, "Item Added Successfully!!!", Toast.LENGTH_LONG).show();

                }

                  }

        });

        Picasso.with(mContext)
                .load("http://protech.absoftwaresolution.com/img/grocery_imgs/grains/"+detailsVO.getImage())
                .placeholder(R.drawable.placeholder)
                .into(image);


        textTitle.setText(detailsVO.getName());

        return listView;
    }

}

当我单击 btnplus 和 btnminus 时,我正在更改反射(reflect)在 ListView 中第四个下一个编辑文本中的编辑文本值

最佳答案

我认为这是因为您的监听器是在 getView() 中声明的。当您上下滚动时,ListView 会回收 View 及其引用。基本上,当您单击第一行中的某个内容时,ListView 会将这些引用更改为其他某个对象。如果没有 View ID 或标签来跟踪它,这些点击就会转移到其他地方。

我尝试解决此问题的方法是在适配器外部为您的 ListView 项目声明一个 OnItemClickListener。在里面,检测哪个 subview (按钮+/-)被点击,然后相应地调整你的字符串。一旦你有对容器/ViewGroup 的引用,你应该被设置...

关于android - 反射(reflect)在其他 ListView 子布局中的 ListView 的一个子布局的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38692386/

相关文章:

android - 如何从android中的 ListView 中获取按钮单击时的所有选中值

Android:如何从 Assets 文件创建 File 对象?

Android 从文件夹中打开图库

C# WPF - ListView 绑定(bind)不起作用

android - 创建您自己的自定义适配器时,getView() 方法如何工作?

android - Realm - Realm.init(this) 在 onCreate 中失败?

android - 使用 CursorAdapter 获取 bindView 中的位置

java - 进度对话框未显示在 AsyncTask 中

安卓.view.InflateException : Binary XML file line #7: Error inflating class

android - 布局未在 android 自定义组件中膨胀