2016-03-27 4 views
1

こんにちは、このコードで私はlistitemのテキストを編集しようとしていると、リスト項目の最新のテキストを保存しても、ここでアプリケーションが閉じられた後でも、すでに編集テキストオプションでダイアログボックスのテキストを取得できますListItemの中だけで、事前に事前に定義されたこの小さなもので、任意のテキスト ヘルプへ 感謝を変更する必要がlistitemテキストを動的に編集して保存する方法は?

MainActivity.java:

package com.example.vks_module; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.jar.Attributes.Name; 

import android.app.Activity; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    private ListView mainListView; 
    private ArrayAdapter<String> listAdapter; 
    final Context context = this; 

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

     mainListView = (ListView) findViewById(R.id.lv1); 
     String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
       "Jupiter", "Saturn", "Uranus", "Neptune" }; 
     final ArrayList<String> planetList = new ArrayList<String>(); 
     planetList.addAll(Arrays.asList(planets)); 

     listAdapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, planetList); 

     mainListView.setAdapter(listAdapter); 

     mainListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int pos, 
        long id) { 
       String message = planetList.get(pos); 
       final int positions = mainListView.getSelectedItemPosition(); 
       final Dialog dialog = new Dialog(context); 
       dialog.setContentView(R.layout.customdialog); 
       dialog.setTitle("Change the name"); 

       final TextView plan_names = (TextView) dialog 
         .findViewById(R.id.name); 
       Button set = (Button) dialog.findViewById(R.id.Set); 
       plan_names.setText(message); 
       set.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 

         String name = plan_names.getText().toString(); 

         int pos = positions; 
         if (!name.isEmpty() && name.length() > 0) { 
          // remove 
          listAdapter.remove(planetList.get(pos)); 
          // insert the updated one 
          listAdapter.insert(name, mainListView.getSelectedItemPosition()); 

          listAdapter.notifyDataSetChanged(); 

         } else { 
          Toast.makeText(getApplicationContext(), 
            "Are you serious", Toast.LENGTH_SHORT) 
            .show(); 
         } 

        } 

       }); 

       dialog.show(); 

      } 

     }); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

**activitymain.xml** 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.vks_module.MainActivity" > 
<ListView 
    android:id="@+id/lv1" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_centerHorizontal="true" 
    android:padding="10dp" 
    /> 
</RelativeLayout> 


**customedailog.xml** 

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/holo_blue_light" 
    android:orientation="vertical" > 

    <EditText 
     android:id="@+id/name" 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:layout_centerHorizontal="true" 
     android:gravity="center_horizontal" 
     android:layout_marginTop="100dp" 
     android:background="@android:color/transparent" /> 

    <Button 
     android:id="@+id/Set" 
     android:layout_below="@+id/name" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="20dp" 
     android:text="SET" /> 

</RelativeLayout> 


**LOGCAT** 

03-28 00:17:38.767: D/AndroidRuntime(26713): Shutting down VM 
03-28 00:17:38.774: E/AndroidRuntime(26713): FATAL EXCEPTION: main 
03-28 00:17:38.774: E/AndroidRuntime(26713): Process: com.example.vks_module, PID: 26713 
03-28 00:17:38.774: E/AndroidRuntime(26713): java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1 
03-28 00:17:38.774: E/AndroidRuntime(26713): at java.util.ArrayList.get(ArrayList.java:310) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at com.example.vks_module.MainActivity$1$1.onClick(MainActivity.java:71) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at android.view.View.performClick(View.java:5204) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at android.view.View$PerformClick.run(View.java:21153) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at android.os.Handler.handleCallback(Handler.java:739) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at android.os.Handler.dispatchMessage(Handler.java:95) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at android.os.Looper.loop(Looper.java:148) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at android.app.ActivityThread.main(ActivityThread.java:5417) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at java.lang.reflect.Method.invoke(Native Method) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
03-28 00:17:38.774: E/AndroidRuntime(26713): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

答えて

2

getSelectedItemPosition()のマニュアルが表示されている場合は、何も選択されていない場合はINALID_ROW_ID(値は-1)が返されます。私はあなたがListViewの項目を選択すると、Dialogがフォーカスを取得し、ListViewの項目が選択されなくなるため、コード内のmainListView.getSelectedItemPosition()が常に-1を返していることになります。代わりに、以下のようにメソッドonItemClick()から引数posを使用してください。変更を保存し、アプリを再起動した後でも、新しい値を取得したい場合は

mainListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int pos, 
            long id) { 
       String message = planetList.get(pos); 
       final int positions = pos; //change here 
       final Dialog dialog = new Dialog(context); 
       dialog.setContentView(R.layout.customdialog); 
       dialog.setTitle("Change the name"); 

       final TextView plan_names = (TextView) dialog 
         .findViewById(R.id.name); 
       Button set = (Button) dialog.findViewById(R.id.Set); 
       plan_names.setText(message); 
       set.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 

         String name = plan_names.getText().toString(); 
         if (!name.isEmpty() && name.length() > 0) { 
          // remove 
          listAdapter.remove(planetList.get(positions)); //change here 
          // insert the updated one 
          listAdapter.insert(name, positions); //change here 

          listAdapter.notifyDataSetChanged(); 

         } else { 
          Toast.makeText(getApplicationContext(), 
            "Are you serious", Toast.LENGTH_SHORT) 
            .show(); 
         } 
         dialog.dismiss(); //add this to dismiss dialogue after entering the string 

        } 

       }); 

       dialog.show(); 

      } 

     }); 

、データベースに新しい値を保存してonCreate()方法であなたの配列/配列リストを移入するためにそれらを使用する必要があります。

+0

おかげでそれはうまくいきましたが、質問ごとに、私が編集したリストアイテムを保存する必要がありますか? – Vitesh

0

問題はラインである

final int positions = mainListView.getSelectedItemPosition(); 

あなたはListView項目をクリックするとので、 それはイベントが発生すると、あなたが行う場合は、「選択」に自分の状態を変更、そうしない:

mainListView.getSelectedItem() 

方法はありません。返すものあなたがしなければならないことは、その位置を使用してアンダーレイオブジェクトを取得することです。

あなたは既に、変数POSに同じを持っていますが、あなたはそれをチェックして、あなたが行ってもいいです

int pos = positions; 

でそれを上書きします!

関連する問題