2017-02-16 60 views
0

我想发送列表中的一个项目被长时间点击到另一个活动的列表。但第二个活动,即MySchedule不会更新超过一个项目。 这里是我的代码列表视图不会更新超出一个项目

活动从那里我发送的字符串 (didnt添加字符串代码)

public class CloudEvents extends AppCompatActivity { 

    static int scheduleId = -1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 

       new AlertDialog.Builder(CloudEvents.this) 
         .setIcon(android.R.drawable.ic_dialog_alert) 
         .setTitle("Save Event") 
         .setMessage("Do you want to save this event into your schedule?") 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
          scheduleId++; 

           Toast.makeText(CloudEvents.this,"Saved",Toast.LENGTH_LONG).show(); 
           SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.yatin.whatshappeningdtu", Context.MODE_PRIVATE); 
         sharedPreferences.edit().putString("CloudEvent",listView.getItemAtPosition(position).toString()).apply(); 
           Intent i = new Intent(CloudEvents.this,MySchedule.class); 
           startActivity(i); 


           //myArrayAdapter.notifyDataSetChanged(); 
          } 
         }) 
         .setNegativeButton("No",null) 
         .show(); 

       return true; 
      } 
     }); 

活动接收的字符串,使一个列表

public class MySchedule extends AppCompatActivity { 

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

    final ArrayList<String> schedule = new ArrayList<>(); 
    final ListView scheduleListView = (ListView)findViewById(R.id.scheduleListView); 
    String key = "CloudEvent"; 

    String myEvent =""; 

    SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.yatin.whatshappeningdtu", Context.MODE_PRIVATE); 
    if(sharedPreferences.contains(key)) 
    { 
     myEvent = sharedPreferences.getString(key,""); 
     schedule.add(CloudEvents.scheduleId,myEvent); 

    } 
    final ArrayAdapter myArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,schedule); 

    scheduleListView.setAdapter(myArrayAdapter); 

    scheduleListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 

      new AlertDialog.Builder(MySchedule.this) 
        .setIcon(android.R.drawable.ic_dialog_alert) 
        .setTitle("Are you sure ?") 
        .setMessage("Do you want to delete this note") 
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          schedule.remove(position); 
          myArrayAdapter.notifyDataSetChanged(); 
          CloudEvents.scheduleId--; 

         } 
        }) 
        .setNegativeButton("No",null) 
        .show(); 

      return true; 
     } 
    }); 

} 
} 

(加入后一个项目)

Error:Caused by: java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 
         at java.util.ArrayList.add(ArrayList.java:457) 
         at com.yatin.whatshappeningdtu.MySchedule.onCreate(MySchedule.java:35) 

正在被rac我的大脑王现在几个小时。请帮助谢谢!

+0

检查计划表的大小,将其传递给阵列适配器 – Piyush

+0

'即使阵列为空CloudEvents.scheduleId'返回1日前。所以理想情况下ArrayList.add应该将您的字符串添加到'0'位置。但CloudEvents。scheduleId要求它将其添加到'0'位置,因此错误 –

+0

无法理解你想说的:/ –

回答

0

当您第一次添加项目时,您的CloudEvents.scheduleId从-1被设置为0。假设你的字符串是"FirstEvent",你保存在共享首选项的CloudEvent键中,然后在MySchedule活动中它被添加到schedule的数组列表中,并且它工作正常。

现在,当你回来CloudEvents活动,您CloudEvents.scheduleId是0,因为它是statica变量,又添加了另一个项目,让我们说"SecondEvent",所以CloudEvents.scheduleId将改变从0到1,而你又节省"SecondEvent"字符串CloudEvent关键在先前的值"FirstEvent"将覆盖"SecondEvent"这意味着在MySchedule活动中,您将只从获得sharedpreference,但是您将在schedule的第1个位置添加此数组,并且schedule的第0个位置将被留空。 现在,您在Listview适配器中传递了这个数组列表,其中null值为0,这就是抛出IndexOutOfBoundsException异常的方式。 要解决此问题,您可以维护一个ArrayList<String>。在CloudEvents活动中进行以下更改。

private ArrayList<String> eventList = new ArrayList<>(); 
@Override 
protected void onCreate(Bundle savedInstanceState){ 

     SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.yatin.whatshappeningdtu", Context.MODE_PRIVATE); 
     Collections.addAll(eventList, prefManager.getString("CloudEvent", "").split(",")); 

     listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 

       new AlertDialog.Builder(CloudEvents.this) 
         .setIcon(android.R.drawable.ic_dialog_alert) 
         .setTitle("Save Event") 
         .setMessage("Do you want to save this event into your schedule?") 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           scheduleId++; 

           eventList.add(listView.getItemAtPosition(position).toString()); 
           Toast.makeText(CloudEvents.this, "Saved", Toast.LENGTH_LONG).show(); 

           Intent i = new Intent(CloudEvents.this, MySchedule.class); 
           i.putStringArrayListExtra("EventList", eventList);         
           startActivity(i); 

           //myArrayAdapter.notifyDataSetChanged(); 
          } 
         }) 
         .setNegativeButton("No", null) 
         .show(); 

       return true; 
      } 
     }); 
    } 

现在在MySchedule活动进行以下更改。

公共类MySchedule扩展AppCompatActivity {

ArrayList<String> schedule = new ArrayList<>(); 
    SharedPreferences sharedPreferences; 

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

     sharedPreferences = getApplicationContext().getSharedPreferences("com.yatin.whatshappeningdtu", Context.MODE_PRIVATE); 

     schedule = getIntent().getStringArrayListExtra("EventList"); 
     ListView scheduleListView = (ListView)findViewById(R.id.scheduleListView); 

     final ArrayAdapter myArrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,schedule); 

     scheduleListView.setAdapter(myArrayAdapter); 

     scheduleListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 

       new AlertDialog.Builder(MySchedule.this) 
         .setIcon(android.R.drawable.ic_dialog_alert) 
         .setTitle("Are you sure ?") 
         .setMessage("Do you want to delete this note") 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           schedule.remove(position); 
           myArrayAdapter.notifyDataSetChanged(); 

           String events = ""; 
           for(int i=0; i<schedule.size(); i++){ 
            events = events + schedule.get(i); 
            if(i != (schedule.size() - 1)){ 
             events = events + ","; 
            } 
           } 
           sharedPreferences.edit().putString("CloudEvent", events).apply(); 
          } 
         }) 
         .setNegativeButton("No",null) 
         .show(); 

       return true; 
      } 
     }); 

    } 
} 
+0

谢谢!终于明白了!你能提出一个我应该实施的方法吗? –

+0

查看我的编辑,我对代码进行了少许更改,未经测试,如果您仍然发现任何重大问题,请告知我。 –

0

试试看的commit(),而不是适用()

适用()在2.3加入,它承诺不返回布尔值,指示成功或失败。

如果保存有效,则commit()返回true,否则返回false。

而且请确认用于读取数据的共享首选项的实例与写入数据的实例相同。

+0

共享首选项正在传输数据没有问题,但该列表不更新项目(如果我删除scheduleId ++ )它不断移动'0'项并且不移动增加列表的大小 –