如何在按下一个按钮(保存)时从ListView中提取所有editText的数据

时间:2015-09-18 07:34:28

标签: android listview

这是我发布的第一个问题。这是我的问题,下面给出的是android studio的调试代码。 在这里,我尝试通过将适配器中的数据提取到mainActvity中来提取数据,但是当应用程序崩溃时单击“保存”按钮时,我失败了。这里的数据只不过是对象。

MainActivity :

import android.content.res.Resources;

import android.os.Bundle;


import android.support.v7.app.AppCompatActivity;


import android.view.View;


import android.widget.Button;


import android.widget.ListView;


import android.widget.Toast;

import java.util.ArrayList;



public class MainActivity extends AppCompatActivity {


    ArrayList<ListItem_Elements> testsList;
    int n=5;//No. of tests
    Button btn_save;
    CustomAdapter adapter;


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

        ListView listView = (ListView)findViewById(R.id.listView);
        btn_save= (Button)findViewById(R.id.btn_save);

        //CustomAdapter adapter;
        Resources res=getResources();//Takes the resource permission required to show ListView

        testsList= new ArrayList<ListItem_Elements>();
        testsList = SetList();

        adapter= new CustomAdapter(this, testsList, res);

        listView.setAdapter(adapter);
        btn_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(testsList!=null)
              saveValues();
            }
        });


    }

    public ArrayList<ListItem_Elements> SetList() {

        /*Enter the Test names*/
        ArrayList<ListItem_Elements>tests_Array= new ArrayList<ListItem_Elements>();

        for(int i=0;i<5;i++) {
            ListItem_Elements e = new ListItem_Elements();
            e.setTest("XYZ");
            e.setResult(null);
            tests_Array.add(e);
        }

        return tests_Array;


        }
    ArrayList<ListItem_Elements>ar= new ArrayList<>();


   public void saveValues() {

       if(adapter.extractedArray!=null) {
           ar = adapter.extractedArray;
           Toast.makeText(MainActivity.this, ar.size(), Toast.LENGTH_SHORT).show();
       }
   }
    }

--------------------------------------------------------------------------------
CustomAdapter :
import android.app.Activity;


import android.content.Context;


import android.content.res.Resources;


import android.view.LayoutInflater;


import android.view.View;


import android.view.ViewGroup;


import android.widget.BaseAdapter;


import android.widget.EditText;


import android.widget.TextView;

import java.util.ArrayList;

public class CustomAdapter extends BaseAdapter {

    private Activity activity;


    public static ArrayList<ListItem_Elements> extractedArray= new ArrayList<ListItem_Elements>();

    private ArrayList<ListItem_Elements> array;

    //Declaration of ArrayList which will be used to recieve the ArrayList that has to be putup into the ListView


    private LayoutInflater inflater;        //To Instantiates a layout XML file into its corresponding View
    Resources res;
    //protected String bridgeValue;


    CustomAdapter(Activity a, ArrayList<ListItem_Elements> b, Resources resLocal) {

        activity = a;
        array= b;
        res = resLocal;

//Initialization of inflater to link the layout of list items 


        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


    }

    public CustomAdapter() {
    }

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

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
// keeping references for views we use view holder


    public static class ViewHolder {


        /*Declaration of elements of layout of list items in the class for future use of putting up
           data onto the List View*/

        TextView textView;
        EditText editText;
    }

    @Override
    //Here views were bound to a position


    public View getView(int position, View convertView, ViewGroup parent) {

        View vi = convertView;
        ViewHolder holder;


    // if a view is null(which is for the first item) then create view

        if (convertView == null) {

            vi = inflater.inflate(R.layout.layout_items, null);

// Taking XML files that define the layout of items, and converting them into View objects.

            holder = new ViewHolder();//Stores the elements of the layout of list items


            /*Initializing the elements of the layout of list item*/


            holder.textView = (TextView) vi.findViewById(R.id.textView);
            holder.editText = (EditText) vi.findViewById(R.id.editText);

            vi.setTag(holder);                 


 //Stores the view(layout of list item) into vi

        } 


//else if it already exists, reuse it(for all the next items). Inflate is costly process.


else {
            holder = (ViewHolder) vi.getTag();

//Restores the already exisiting view in the 'vi'


        }


        /*Setting the arrayList data onto the different elements of the layout of list item*/


try {
    holder.textView.setText(array.get(position).getTest());

    if(holder.editText.getText()!=null) {
        ListItem_Elements obj = new ListItem_Elements();
        obj.setTest(array.get(position).getTest());
        obj.setResult(holder.editText.getText().toString());
        extractedArray.add(position, obj);
    }

}
catch (Exception e) {
    e.getMessage();
}

        return vi;//Returns the view stored in vi i.e contents of layout of list items
    }

}

--------------------------------------------------------------------------------
public class ListItem_Elements {
    String test;
    String result;
    ListItem_Elements() {
    }

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

}

2 个答案:

答案 0 :(得分:1)

您缺少一些必要的代码。 EditText有一个名为addTextChangedListener()的方法,它接受TextWatcher实现。此实现将负责更新适配器中的数据。

    final ListItem_Elements item = array.get(position);
    holder.textView.setText(item.getTest());
    holder.editText.setText(item.getResult());
    holder.editText.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            item.setResult(s.toString());
        }

        // omitted empty impls for beforeTextChanged() and afterTextChanged(), you need to add them

    });

现在,每次用户更新EditText时,您的适配器值都会更新。然后你得到数组值:

    public void saveValues() {

        // testLists in the activity and array in the adapter are references 
        // to the same list.  So testLists already has the updated results
    }

并取出整个代码块:

holder.textView.setText(array.get(position).getTest());

if(holder.editText.getText()!=null) {
    ListItem_Elements obj = new ListItem_Elements();
    obj.setTest(array.get(position).getTest());
    obj.setResult(holder.editText.getText().toString());
    extractedArray.add(position, obj);
}

它没有做正确的事。

答案 1 :(得分:0)

您正在使用ArrayList中的值填充listView。为什么你不只是从ArrayList ??

获取值
public void saveValues() {

       if(tests_Array!=null) {
           //and here you get values from your list
           //by a simple for instruction
           Toast.makeText(MainActivity.this, tests_Array.size(), Toast.LENGTH_SHORT).show();
       }
   }