2015-03-19 3 views
0

У меня очень большая проблема, ну для меня это так ... Так вот.
У меня есть фрагмент, который содержит TextView и кнопку, когда я нажимаю кнопку и выбираю контакты, и мне нужны номера и имена, хранящиеся в ListView, и справа от имени и номера, я хочу кнопку, которая будет там так что выбранный контакт может быть удален ... Я не знаю, понимаете ли вы, поэтому в ListView все, что будет храниться как отдельный элемент, NAME, чем под именем, является NUMBER контакта, а с правой стороны - delete button ... Я знаю, что мне нужно использовать пользовательский адаптер, но я просто не понимаю.Как поставить ListView в фрагменте

Вот код для моего адаптера

private class MessageAdapter extends ArrayAdapter<Message> { 

     public MessageAdapter(ArrayList<Message> messages) { 
      super(getActivity(), 0, messages); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // If we weren't given a view, inflate one 
      if (convertView == null) { 
       convertView = getActivity().getLayoutInflater().inflate(
         R.layout.list_item_contact, null); 
      } 

      // Configure the view for this Contact 
      Message m = getItem(position); 

      TextView nameTextView = (TextView) convertView 
        .findViewById(R.id.contact_list_item_nameTextView); 
      nameTextView.setText(m.getNames()); 

      TextView numberTextView = (TextView) convertView 
        .findViewById(R.id.contact_list_item_numberTextView); 
      numberTextView.setText(m.getNumbers()); 

      return convertView; 
     } 
    } 

и вот что я пытаюсь сделать, чтобы поместить контакт в списке ...

if (requestCode == REQUEST_CONTACT) { 
      Uri result = data.getData(); 
      Log.v("Contact", "Got a result: " + result.toString()); 

      // get the contact id from the Uri 
      String id = result.getLastPathSegment(); 

      // query for phone numbers for the selected contact id 
      Cursor c = getActivity().getContentResolver() 
        .query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", 
          new String[] { id }, 
          ContactsContract.Contacts.DISPLAY_NAME); 

      int phoneIdx = c.getColumnIndex(Phone.NUMBER); 
      int phoneType = c.getColumnIndex(Phone.TYPE); 
      int nameIdx = c.getColumnIndex(Phone.DISPLAY_NAME); 

      if (c.getCount() == 1) { 
       c.moveToFirst(); 
       // contact has a single phone number, so there's no need to 
       // display a second dialog 
       mName = c.getString(nameIdx); 
       mNumber = c.getString(phoneIdx); 

       // Ovo radim ovako da bih mogao da ih upisem u fajl 
       mMessage.setmNames(mName); 
       mMessage.setmNumbers(mNumber); 
       ((MessageAdapter) getListAdapter()).notifyDataSetChanged(); 
       c.close(); 
      } 
     } 

Так что, когда я получаю номер и имя выбранного контакта Я хочу добавить его в список, но я всегда получаю только последний выбранный номер и имя ... Надеюсь, вы поймете, что я имею в виду, спасибо.

И здесь являются onCreate и onCreateView, на всякий случай:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_message, container, false); 



     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      // Ovo ispod omogucava da se ugase sve activities i da se vrati na 
      // pocetnu valjda 
      // Zavisi sta smo stavili da nam bude parent class u xml manifest 
      if (NavUtils.getParentActivityName(getActivity()) != null) { 
       getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); 
      } 
     } 

     mTextField = (EditText) v.findViewById(R.id.message_text); 
     mTextField.setText(mMessage.getmText()); 
     mTextField.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       mMessage.setmText(s.toString()); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 

     mAddContactButton = (Button) v.findViewById(R.id.message_contact); 

     mAddContactButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Intent i = new Intent(Intent.ACTION_PICK, 
         ContactsContract.Contacts.CONTENT_URI); 
       startActivityForResult(i, REQUEST_CONTACT); 
      } 
     }); 

     return v; 
    } 

и OnCreate

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mMessage = new Message(); 

     UUID messageId = (UUID) getArguments() 
       .getSerializable(EXTRA_MESSAGE_ID); 

     mMessage = MessageLab.get(getActivity()).getMessage(messageId); 

     mMessages = MessageLab.get(getActivity()).getMessages(); 

     MessageAdapter adapter = new MessageAdapter(mMessages); 
     setListAdapter(adapter); 

     setHasOptionsMenu(true); 
    } 

класс

public class MessageFragment extends ListFragment { 

    private ArrayList<String> names_list = new ArrayList<String>(); 
    private ArrayList<String> numbers_list = new ArrayList<String>(); 
    private ArrayList<Message> mMessages; 

    private Message mMessage; 

    private EditText mTextField; 
    private Button mAddContactButton; 

    private String mName, mNumber; 
    private String build_name="", build_number=""; 

    public static final String EXTRA_MESSAGE_ID = "com.falca.emergencymessage.message_id"; 

    private static final int REQUEST_CONTACT = 2; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mMessage = new Message(); 

     UUID messageId = (UUID) getArguments() 
       .getSerializable(EXTRA_MESSAGE_ID); 

     mMessage = MessageLab.get(getActivity()).getMessage(messageId); 

     mMessages = MessageLab.get(getActivity()).getMessages(); 

     MessageAdapter adapter = new MessageAdapter(mMessages); 
     setListAdapter(adapter); 

     setHasOptionsMenu(true); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      if (NavUtils.getParentActivityName(getActivity()) != null) { 
       NavUtils.navigateUpFromSameTask(getActivity()); 
      } 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

    @TargetApi(11) 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_message, container, false); 



     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      // Ovo ispod omogucava da se ugase sve activities i da se vrati na 
      // pocetnu valjda 
      // Zavisi sta smo stavili da nam bude parent class u xml manifest 
      if (NavUtils.getParentActivityName(getActivity()) != null) { 
       getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); 
      } 
     } 

     mTextField = (EditText) v.findViewById(R.id.message_text); 
     mTextField.setText(mMessage.getmText()); 
     mTextField.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       mMessage.setmText(s.toString()); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 

     mAddContactButton = (Button) v.findViewById(R.id.message_contact); 

     mAddContactButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Intent i = new Intent(Intent.ACTION_PICK, 
         ContactsContract.Contacts.CONTENT_URI); 
       startActivityForResult(i, REQUEST_CONTACT); 
      } 
     }); 

     return v; 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode != Activity.RESULT_OK) 
      return; 
     if (requestCode == REQUEST_CONTACT) { 
      Uri result = data.getData(); 
      Log.v("Contact", "Got a result: " + result.toString()); 

      // get the contact id from the Uri 
      String id = result.getLastPathSegment(); 

      // query for phone numbers for the selected contact id 
      Cursor c = getActivity().getContentResolver() 
        .query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", 
          new String[] { id }, 
          ContactsContract.Contacts.DISPLAY_NAME); 

      int phoneIdx = c.getColumnIndex(Phone.NUMBER); 
      int phoneType = c.getColumnIndex(Phone.TYPE); 
      int nameIdx = c.getColumnIndex(Phone.DISPLAY_NAME); 

      if (c.getCount() > 1) { // contact has multiple phone numbers 
       final CharSequence[] numbers = new CharSequence[c.getCount()]; 
       int i = 0; 
       if (c.moveToFirst()) { 
        mName = c.getString(nameIdx); 
        while (!c.isAfterLast()) { // for each phone number, add it 
               // to the numbers array 
         String type = (String) Phone.getTypeLabel(
           this.getResources(), c.getInt(phoneType), ""); // insert 
                       // a 
                       // type 
                       // string 
                       // in 
                       // front 
                       // of 
                       // the 
                       // number 
         String number = type + ": " + c.getString(phoneIdx); 
         numbers[i++] = number; 
         c.moveToNext(); 
        } 
        // build and show a simple dialog that allows the user to 
        // select a number 
        AlertDialog.Builder builder = new AlertDialog.Builder(
          getActivity()); 
        builder.setTitle(R.string.select_contact_phone_number_and_type); 
        builder.setItems(numbers, 
          new DialogInterface.OnClickListener() { 

           @Override 
           public void onClick(DialogInterface dialog, 
             int item) { 
            mNumber = (String) numbers[item]; 
            int index = mNumber.indexOf(":"); 
            mNumber = mNumber.substring(index + 2); 

            // Ovo radim ovako da bih mogao da ih upisem 
            // u fajl 
            build_name += mName + ";"; 
            build_number += mNumber + ";"; 
            mMessage.setmNames(build_name); 
            mMessage.setmNumbers(build_number); 
            ((MessageAdapter) getListAdapter()).notifyDataSetChanged(); 
           } 
          }); 
        AlertDialog alert = builder.create(); 
        alert.setOwnerActivity(getActivity()); 
        alert.show(); 

       } else 
        Log.w("Contact", "No results"); 
      } else if (c.getCount() == 1) { 
       c.moveToFirst(); 
       // contact has a single phone number, so there's no need to 
       // display a second dialog 
       mName = c.getString(nameIdx); 
       mNumber = c.getString(phoneIdx); 

       // Ovo radim ovako da bih mogao da ih upisem u fajl 
       build_name += mName + ";"; 
       build_number += mNumber + ";"; 
       mMessage.setmNames(build_name); 
       mMessage.setmNumbers(build_number); 
       ((MessageAdapter) getListAdapter()).notifyDataSetChanged(); 
       c.close(); 
      } 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     // Update the list view 
     ((MessageAdapter) getListAdapter()).notifyDataSetChanged(); 
    } 


    //MessageAdapter sluzi za rucno pravljenje liste poruka 
    private class MessageAdapter extends ArrayAdapter<Message> { 

     public MessageAdapter(ArrayList<Message> messages) { 
      super(getActivity(), 0, messages); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // If we weren't given a view, inflate one 
      if (convertView == null) { 
       convertView = getActivity().getLayoutInflater().inflate(
         R.layout.list_item_contact, null); 
      } 

      // Configure the view for this Message 
      Message m = getItem(position); 

      TextView nameTextView = (TextView) convertView 
        .findViewById(R.id.contact_list_item_nameTextView); 
      nameTextView.setText(m.getmNames()); 

      TextView numberTextView = (TextView) convertView 
        .findViewById(R.id.contact_list_item_numberTextView); 
      numberTextView.setText(m.getmNumbers()); 

      return convertView; 
     } 
    } 

    public static MessageFragment newInstance(UUID messageId) { 
     Bundle args = new Bundle(); 
     args.putSerializable(EXTRA_MESSAGE_ID, messageId); 

     MessageFragment fragment = new MessageFragment(); 

     fragment.setArguments(args); 

     return fragment; 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     MessageLab.get(getActivity()).saveMessages(); 
    } 
} 
+0

О, и я расширяю ListFragment, а не фрагмент – P3P5

+0

Итак, какие проблемы вы испытываете? Что пошло не так? – Treeline

+0

Можете ли вы разместить свой код, где определен 'mMessages'? –

ответ

0

кажется, что вы всегда обновлять тот же сингл поле mMessage.

mMessage.setmNames(build_name); 
mMessage.setmNumbers(build_number); 

Когда у вас есть новая запись, вы должны обновить данные ArrayList mMessages. Добавьте запись в список. Адаптер всегда имеет этот массивList в качестве источника данных, поэтому вам нужно обновить этот массивList.

Итак, для каждой записи создайте новое сообщение и добавьте его в список массивов mMessages.

+0

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

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