2016-07-14 2 views
0

Я пытаюсь работать с listactivity в нем. Я добавляю элементы в строки списка. но когда я загружаю разные данные, чтобы добавить элемент в виде списка, он повторяет тот же элемент, добавленный ранее.Android Listview Item is Repeating при добавлении нового элемента с разными данными

вот мой baseadapter класс:

public class MyNotiAdapter extends BaseAdapter { 

    Context context; 
    String[] data; 
    String time; 
    String Name ; 
    String Number; 

    private static LayoutInflater inflater = null; 
    public MyNotiAdapter(Context context, String[] data,String time, String Name ,String Number) { 
     // TODO Auto-generated constructor stub 
     this.context = context; 
     this.data = data; 
     this.time = time; 
     this.Name = Name; 
     this.Number=Number; 
     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return data.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return data[position]; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public int getViewTypeCount() { 

    return getCount(); 
    } 

    @Override 
    public int getItemViewType(int position) { 

    return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     ViewHolder mHolder; 
     View vi = convertView; 
     if (vi == null){ 
      vi = inflater.inflate(R.layout.row2, null); 

     mHolder = new ViewHolder(); 
     mHolder.text= (TextView) vi.findViewById(R.id.lablel); 
     mHolder.Nameo = (TextView) vi.findViewById(R.id.person); 
     mHolder.Numbero = (TextView) vi.findViewById(R.id.edu); 
     mHolder.Time = (TextView) vi.findViewById(R.id.tym); 
     vi.setTag(mHolder); 



     mHolder.text.setText(data[position]); 
     mHolder.Nameo.setText(Name); 
     mHolder.Numbero.setText(Number); 
     mHolder.Time.setText(time); 

    }else { 
      mHolder = (ViewHolder) convertView.getTag(); 
     } 

     return vi; 
    } 


    public class ViewHolder { 
     public TextView text; 
     public TextView Nameo; 
     public TextView Numbero; 
     public TextView Time; 


    } 


} 

и здесь является деятельность, в которой я установочные данные адаптера ...

public class noticall extends ListActivity { 


    CustomDateTimePicker custom; 
    TextView tv,tv1; 
    EditText ed; 
    String store; 
    static String Names; 
    public static final int PICK_CONTACT = 1; 
    String [] adi ; 
    static int incre=0; 
    ArrayList<String> myrows = new ArrayList<String>(); 
    private PendingIntent pendingIntent; 
    ListView listview; 
    String temp1 ,temp2 ; 
    int x=0; 
    OnItemClickListener listener; 
    String Date,Time,Name,Number; 
    MyNotiAdapter adp; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.notify); 
      listview = (ListView) findViewById(android.R.id.list); 

      listview.setDividerHeight(5); 


      custom = new CustomDateTimePicker(noticall.this,new CustomDateTimePicker.ICustomDateTimeListener() { 

       @Override 
       public void onCancel() { 
        finish(); 
       } 


       @Override 
       public void onSet(Dialog dialog, Calendar calendarSelected,Date dateSelected, int year, String monthFullName, 
          String monthShortName, int monthNumber, int date, 
          String weekDayFullName, String weekDayShortName, 
          int hour24, int hour12, int min, int sec, 
          String AM_PM) { 

         Calendar calendar = Calendar.getInstance(); 
         calendar.set(year, monthNumber, date, hour24, min, 0); 

         long when = calendar.getTimeInMillis();   // notification time 

         Intent myIntent = new Intent(noticall.this, MyReceiver.class); 
         pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0); 

         AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
         alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent); 



     //temp1= store =calendarSelected.get(Calendar.DAY_OF_MONTH) + "/" + (monthNumber+1) + "/" + 
    // year + ", " + hour12 + ":" + min + " " + AM_PM; 


     Date = calendarSelected.get(Calendar.DAY_OF_MONTH) + "/" + (monthNumber+1) + "/" +year; 
     Time = hour12 + ":" + min + " " + AM_PM; 

     Log.e("Timeee", Time+""); 


     setlisto(Date); 

     Toast.makeText(noticall.this, store, Toast.LENGTH_SHORT).show(); 

      } 
    });  


     /* 
      Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
      startActivityForResult(intent,PICK_CONTACT); 

      /** 
      * Pass Directly current time format it will return AM and PM if you set 
      * false 
      */ 
      custom.set24HourFormat(false); 
      /** 
      * Pass Directly current data and time to show when it pop up 
      */ 
      custom.setDate(Calendar.getInstance()); 

      //custom.showDialog(); 


       findViewById(R.id.button_date).setOnClickListener(
        new OnClickListener() { 
         @Override 
         public void onClick(View v) { 
         Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
         startActivityForResult(intent,PICK_CONTACT); 
         custom.showDialog(); 
         incre++; 
         } 
        }); 

     // ((BaseAdapter) listview.getAdapter()).notifyDataSetChanged() ; 
     // listview.getAdapter().notifyAll(); 
    } 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     super.onActivityResult(requestCode, resultCode, data); 

     if(resultCode != RESULT_CANCELED){ 

      if (requestCode == 1) 
      { 
       // Get the URI that points to the selected contact 
       Uri contactUri = data.getData(); 

       // We only need the NUMBER column, because there will be only one row in the result 
       String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.CONTACT_ID}; 

       String[] segments = contactUri.toString().split("/"); 
       String id = segments[segments.length - 1]; 

       // Perform the query on the contact to get the NUMBER column 
       // We don't need a selection or sort order (there's only one result for the given URI) 
       // CAUTION: The query() method should be called from a separate thread to avoid blocking 
       // your app's UI thread. (For simplicity of the sample, this code doesn't do that.) 
       // Consider using CursorLoader to perform the query. 
       Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null); 
       cursor.moveToFirst(); 
       while (!cursor.isAfterLast()) 
       { 
        int cid = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID); 
        String contactid = cursor.getString(cid); 

        if (contactid.equals(id)) 
        { 
         // Retrieve the phone number from the NUMBER column 
         int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 
         String number = cursor.getString(column); 

         // Retrieve the contact name from the DISPLAY_NAME column 
         int column_name = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 
         String name = cursor.getString(column_name); 

         // Do something with the phone number... 
         // Toast.makeText(this, "I added the Contact: \n" + name + " " + number, Toast.LENGTH_SHORT).show(); 

         // ed.setText(name+" - "+number); 

         Name= Names=name; 
         Number =number; 



        } 

       cursor.moveToNext(); 
       } 
       cursor.close(); 

       } 
      } 
     } 


    public void setlisto(String one){ 

    Log.e("setlistoo",one+""); 
    myrows.add(one); 
    adi = myrows.toArray(new String[myrows.size()]); 
    listview.setAdapter(new MyNotiAdapter(noticall.this, adi,Time,Name,Number)); 


    // ((BaseAdapter) listview.getAdapter()).notifyDataSetChanged(); 
    //listview.invalidateViews(); 

    x++; 

    } 

} 

я прошел через все решения, предусмотренных в Интернете. Я думаю, что я что-то ошибаюсь. если кто-нибудь может найти, где проблема ...?

Я заметил, что только массив данных [] обновляется разными значениями. но другие переменные String переписываются на каждый элемент, который я добавляю .. почему это происходит?

+0

вы можете предоставить myrows класс объекта? – faruk

+0

отредактировал и добавил класс –

+0

@AlZill я думаю, когда добавляю новые данные в адаптер, он добавляет новые данные о ранее добавленных элементах как хорошо. –

ответ

0

ладно я решил его сам. проблема заключалась в том, что я проходил простую строку, но мне нужно передать строковый массив, чтобы добавить новые данные в listviews.

здесь изменения я сделал ..

в деятельности:

public void setlisto(String one){ 

    Log.e("setlistoo",one+""); 
    myrows.add(one); 
    time1.add(Time); 
    name1.add(Name); 
    number1.add(Number); 


    adi = myrows.toArray(new String[myrows.size()]); 
    adi1=time1.toArray(new String[time1.size()]); 
    adi2=name1.toArray(new String[name1.size()]); 
    adi3=number1.toArray(new String[number1.size()]); 
    listview.setAdapter(new MyNotiAdapter(noticall.this, adi,adi1,adi2,adi3)); 

    // if(adi!=null) 
     //adp.notifyDataSetChanged(); 

    x++; 

    } 

в классе baseadapter:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     ViewHolder mHolder; 
     View vi = convertView; 
     if (vi == null){ 
      vi = inflater.inflate(R.layout.row2, null); 

     mHolder = new ViewHolder(); 
     mHolder.text= (TextView) vi.findViewById(R.id.lablel); 
     mHolder.Nameo = (TextView) vi.findViewById(R.id.person); 
     mHolder.Numbero = (TextView) vi.findViewById(R.id.edu); 
     mHolder.Time = (TextView) vi.findViewById(R.id.tym); 
     vi.setTag(mHolder); 



     mHolder.text.setText(data[position]); 
     mHolder.Nameo.setText(Name[position]); 
     mHolder.Numbero.setText(Number[position]); 
     mHolder.Time.setText(time[position]); 

    }else { 
      mHolder = (ViewHolder) convertView.getTag(); 
     } 

     return vi; 
    } 

теперь все идет гладко ... его работает идеально. это может помочь кому-то вроде меня. Cheers ..

0

Я думаю, вам нужно выполнить вызов метода notifyDataSetChanged и перед добавлением данных динамически называть setAdapter.

или вы можете перейти по этой ссылке http://androidadapternotifiydatasetchanged.blogspot.in/

+0

Я попытался использовать notifydatasetchanged, но это не помогло .. если вы можете увидеть мой код. вероятно, вы можете найти ошибку, которую я делаю. я буду благодарен .. –

1

Ваш код, похоже, нуждается в рефакторинге.

  • Хорошо Во-первых, создать класс Object Model, скажем MyReminderObject.java:

    public class MyReminderObject { 
        public String date; 
        public String time; 
        public String name; 
        public String number; 
    } 
    
  • В вашем адаптере:

    Добавить список MyReminderObject.

    private List<MyReminderObject> mList; 
    

    Добавить новый конструктор:

    public MyNotiAdapter(Context context) { 
        mList = new ArrayList<MyReminderObject>(); 
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    

    Изменить некоторые методы:

    @Override 
    public int getCount() { 
        return mList.size(); 
    } 
    
    @Override 
    public Object getItem(int position) { 
        return mList.get(position); 
    } 
    

    В вашем методе GetView, изменить некоторые коды:

    MyReminderObject item = mList.get(position); 
    mHolder.text.setText(item.date); 
    mHolder.Nameo.setText(item.name); 
    mHolder.Numbero.setText(item.number); 
    mHolder.Time.setText(item.time); 
    

    Еще в вас адаптер , добавьте функцию для добавления элемента:

    public void addReminder(MyReminderObject item){ 
        mList.add(item); 
        notifyDataSetChanged(); 
    } 
    
  • В вашей деятельности:

    в вашем OnCreate():

    listview.setDividerHeight(5); 
    adp = new MyNotiAdapter(noticall.this); 
    listview.setAdapter(adp); 
    

    Наконец, на вашем setListTo() метод:

    public void setlisto(String one){ 
    
        Log.e("setlistoo",one+""); 
        MyReminderObject newItem = new MyReminderObject(); 
        newItem.date = one; 
        newItem.time = Time; 
        newItem.name = Name; 
        newItem.number = Number; 
    
        adp.addReminder(newItem); 
    
        x++; 
    
    } 
    
+0

у меня есть точка. да, я код, как правило, нужно реорганизовать, но я должен был это сделать позже. пока я просто хотел, чтобы функциональность работала. ваш ответ хорош. это помогает много .. спасибо –

Смежные вопросы