Android列表视图项目重复添加具有不同数据的新项目

时间:2016-07-14 14:08:25

标签: android listview baseadapter

我正在尝试使用listactivity,我正在向listview行添加项目。但是当我加载不同的数据以在列表视图中添加项目时,它会重复之前添加的相同项目。

这是我的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++;

  }

}

我已经完成了互联网上提供的所有解决方案。我想我在某个地方犯了一些错误。如果有人能找到问题所在......?

我注意到只有Data []数组正在使用不同的值进行更新。但是其他String变量会覆盖我添加的每个项目..为什么会发生这种情况?

3 个答案:

答案 0 :(得分:1)

您的代码似乎需要进行大量重构。

  • 好的首先,创建一个Model Object类,比方说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++;
    
    }
    

答案 1 :(得分:0)

我认为你需要调用notifyDataSetChanged方法并在添加数据之前动态调用setAdapter。

或者您可以浏览此链接http://androidadapternotifiydatasetchanged.blogspot.in/

答案 2 :(得分: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;
    }
现在一切顺利......工作完美。它可能会帮助像我这样的人。干杯..