ANDROID:保存第一个项目后,从列表视图中将下一个项目获取到editText

时间:2018-11-16 04:51:51

标签: java android listview onclicklistener

我所拥有的:(第一功能) 我有一个listview活动,其中填充了JSON url中的项目。我还有另一个活动,将listItem移到editText字段,然后单击“保存”,将值保存为dB。

我还想要什么:(第二功能) 当我单击保存时,而不是返回到列表视图并选择下一个listItem,我希望editText为我填充新的listItem。但是我在每个步骤中都会犯错误。

下面是我为第一功能编写的代码。我知道只有少数几行可以实现第二个功能,但为此而苦苦挣扎。

  

这里的问题是我无法从一个调用列表String变量   活动给另一个,并为其分配位置或计数器。建议我   这里要更改什么。

MainActivity.java (包含用json url中的项目填充的ListView的类)

package com.example.app.listview;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    ListView listView;
    ArrayList<String> tutorialList = new ArrayList<String>();

    private final static String URL = "-----json------url----file";

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

        new FetchDataTask().execute(URL);

    }

    private class FetchDataTask extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... params) {

            InputStream inputStream = null;
            String result= null;
            HttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(params[0]);

            try {

                HttpResponse response = client.execute(httpGet);
                inputStream = response.getEntity().getContent();

                // convert inputstream to string
                if(inputStream != null){
                    result = convertInputStreamToString(inputStream);
                    Log.i("App", "Data received:" +result);

                }
                else
                    result = "Failed to fetch data";

                return result;

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String dataFetched) {
            //parse the JSON data and then display
            parseJSON(dataFetched);
        }


        private String convertInputStreamToString(InputStream inputStream) throws IOException{
            BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
            String line = "";
            String result = "";
            while((line = bufferedReader.readLine()) != null)
                result += line;

            inputStream.close();
            return result;

        }

        private void parseJSON(String data){

            try{
                JSONArray jsonMainNode = new JSONArray(data);

                int jsonArrLength = jsonMainNode.length();

                for(int i=0; i < jsonArrLength; i++) {
                    JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
                    String postTitle = jsonChildNode.getString("codeid");
                    tutorialList.add(postTitle);
                }

                // Get ListView object from xml
                listView = (ListView) findViewById(R.id.list);

                // Define a new Adapter
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, tutorialList);

//                 Assign adapter to ListView
                listView.setAdapter(adapter);
                        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                            @Override
                            public void onItemClick(AdapterView<?> parent, View view, int i, long id) {
                                Intent intent =  new Intent(MainActivity.this, AddFlowerInfo.class);
                                intent.putExtra("Code", listView.getItemAtPosition(i).toString());
                                startActivity(intent);
                            }
        });

            }catch(Exception e){
                Log.i("App", "Error parsing data" +e.getMessage());

            }
        }
    }
}

editText.java (包含editText字段并保存为dB的类)

package com.example.app.listview;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.util.Log;
import android.view.View;

public class AddFlowerInfo extends AppCompatActivity  {
    EditText editText; //non editable codeid <<----<<----<<----<<--<<---<<1
    private static final String TAG = "AddFlowerInfo";

    Button savedata;
    String noneditcode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_flower_info);
        editText = (EditText) findViewById(R.id.codeid);
        savedata = (Button) findViewById(R.id.saveflowerinfo);

        final String Codeholder = getIntent().getStringExtra("Code");
        editText.setText(Codeholder);
      }

    public void dataflowerinfo(View view){

        noneditcode = editText.getText().toString();


        String method = "FlowerInfo";
        BackgroundTask2 backgroundTask2 = new BackgroundTask2(this);
        backgroundTask2.execute(method, noneditcode);
        finish();

    }

更新AddFlowerInfo.java(OnCreate)和(OnClick)

public class AddFlowerInfo extends AppCompatActivity  {
    EditText editText; //non editable codeid <<----<<----<<----<<--<<---<<1
    private static final String TAG = "AddFlowerInfo";

    Button savedata;
    int i=0;

    String noneditcode;
    int pos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_flower_info);
        editText = (EditText) findViewById(R.id.codeid);
        savedata = (Button) findViewById(R.id.saveflowerinfo);

        Intent i =getIntent();
        final ArrayList<String> list = i.getStringArrayListExtra("key");
          pos = i.getIntExtra("position", 0);

//        final String Codeholder = getIntent().getStringExtra("Code");
        editText.setText(list.get(pos));

        savedata.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =  new Intent(AddFlowerInfo.this, AddFlowerInfo.class);
                startActivity(intent);

                ++pos;
                if(pos<=list.size()-1)

                    list.get(pos);

            }
        });

2 个答案:

答案 0 :(得分:0)

通过这样的活动传递数据

 ArrayList<String> tutorialList = new ArrayList<String>();  
 Intent intent = new Intent(ActivityName.this, Second.class);
 intent.putStringArrayListExtra("key", tutorialList);
 startActivity(intent);

要检索AddFlowerInfo

Intent i = getIntent();  
ArrayList<String> list = i.getStringArrayListExtra("key");

然后,当您使用位置从列表中检索数据时,每次将呼叫数据保存到下一个位置后,每次

答案 1 :(得分:0)

您需要将完整的数组连同位置发送到AddFlowerInfo,因此更改您的onItemClick代码:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int i, long id) {
                Intent intent =  new Intent(MainActivity.this, AddFlowerInfo.class);
                intent.putExtra("position", i);
                intent.putStringArrayListExtra("array",tutorialList);
                startActivity(intent);
            }
        });

现在在AddFlowerInfo中:

 Intent i = getIntent();
        ArrayList<String> tutorialList = i.getStringArrayListExtra("array");
        int pos=i.getIntExtra("position",0);

使用该位置从tutorialList获取物品。

要在用户返回上一个活动时更新数据,请放置以下代码:

 new FetchDataTask().execute(URL);

进入onResume方法。

更新

保存第一项以编辑第二项后使用:

++pos;
if(pos<=tutorialList.size()-1)
    editText.setText(tutorialList.get(pos)); 
else
 {
   // you are after last item do whatever you want
 }