2016-10-21 2 views
0

У меня есть приложение телефонной книги, в котором хранятся новые Контакты в таблице sqlite. У меня есть действия по добавлению и (списку) Просмотр контактов, и они работают нормально.
Теперь мне нужна информация, которая покажет детали контакта, заключенные в спискеView. Я знаю, что должен использовать onItemClickListener(), но все, что я пробовал, не работает. Подробности Активность содержит три текстовых поля (имя, фамилия, телефон).
Все, что я могу получить это ошибка:как передать данные щелкнутого элемента с помощью onItemClickListener() в другую активность

DataProvider не может быть приведен к java.lang.String

Если есть другой способ сделать это, пожалуйста, будьте так добры рассказать мне, как ,

Вот DisplayDataActivity.java:

public class DisplayDataActivity extends AppCompatActivity { 


ListView listView; 
SQLiteDatabase sqLiteDatabase; 
UserDbHelper userDbHelper; 
Cursor cursor; 
ListDataAdapter listDataAdapter; 


EditText Search_Last; 
String search_Last; 

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



    Search_Last = (EditText) findViewById(R.id.searchName); 

    // This part of the code is from tutorial 
    listView = (ListView) findViewById(R.id.list_view_display); 
    listDataAdapter = new ListDataAdapter(getApplicationContext(), R.layout.row_layout); 
    listView.setAdapter(listDataAdapter); 

    userDbHelper = new UserDbHelper(getApplicationContext()); 
    sqLiteDatabase = userDbHelper.getReadableDatabase(); 
    cursor = userDbHelper.getInformations(sqLiteDatabase); 
    if (cursor.moveToFirst()) { 
     do { 

      String name, lastName, phone; 
      name = cursor.getString(0); 
      lastName = cursor.getString(1); 
      phone = cursor.getString(2); 
      DataProvider dataProvider = new DataProvider(name, lastName); 
      listDataAdapter.add(dataProvider); 

     } while (cursor.moveToNext()); 
    } 

    // Opens detailed view when contact is clicked 
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 



      TextView entryName = (TextView) findViewById(R.id.entryNameDetail); 
      TextView entryLastName = (TextView) findViewById(R.id.entryLastDetail); 
      TextView entryPhone = (TextView) findViewById(R.id.entryPhoneDetail); 

      String data = (String) parent.getItemAtPosition(position); 


      String Name = entryName.getText().toString(); 
      String Last = entryLastName.getText().toString(); 
      String Phone = entryPhone.getText().toString(); 

      Intent modify_intent = new Intent(getApplicationContext(), DetailView.class); 
      modify_intent.putExtra("Name", Name); 
      modify_intent.putExtra("last", Last); 
      modify_intent.putExtra("phone", Phone); 

      startActivity(modify_intent); 


     } 
    }); 



} 

Вот DataProvider.java:

public class DataProvider { 

private String name; 
private String lastName; 
private String phone; 

public String getLastName() { 
    return lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public DataProvider(String name, String lastName) 
{ 
    this.name = name; 
    this.lastName = lastName; 


}} 

DetailView.java:

public class DetailView extends AppCompatActivity { 

TextView entryName, entryLastName, entryPhone; 
ImageView entryPhoto; 
Cursor cursor; 

private DataProvider dataProvider; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_detail_view); 




    /* WHEN I RUN THIS PART OF THE CODE, THE NAME TEXTVIEW SHOWS EMPTY 
    Bundle data_from_list = getIntent().getExtras(); 
    String value_in_name = data_from_list.getString("passed key data"); 
    TextView entryName = (TextView)findViewById(R.id.entryNameDetail); 
    entryName.setText(value_in_name); 
    */ 

    /* Running this code throws me an error from above */ 
    Intent modify_intent = getIntent(); 
    String s1 = modify_intent.getStringExtra("Name"); 
    String s2 = modify_intent.getStringExtra("Last"); 
    String s3 = modify_intent.getStringExtra("Phone"); 

    entryName = (TextView) findViewById(R.id.entryNameDetail); 
    entryLastName = (TextView) findViewById(R.id.entryLastDetail); 
    entryPhone = (TextView) findViewById(R.id.entryPhoneDetail); 

    entryName.setText(s1); 
    entryLastName.setText(s2); 
    entryPhone.setText(s3); 


    // Adding hardcoded data into TextView for testing purposes 
    // WORKING 
    //entryName.setText("Test ime"); 
    //entryLastName.setText("Test PRezime"); 
    //entryPhone.setText("test telefon"); 


}} 

ListDataAdapter.class:

public class ListDataAdapter extends ArrayAdapter { 
List list = new ArrayList(); 

public ListDataAdapter(Context context, int resource) { 
    super(context, resource); 
} 

static class LayoutHandler 
{ 
    TextView NAME, LASTNAME; 

} 

@Override 
public void add(Object object) { 
    super.add(object); 
    list.add(object); 
} 

@Override 
public int getCount() { 
    return list.size(); 
} 

@Nullable 
@Override 
public Object getItem(int position) { 
    return list.get(position); 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View row = convertView; 
    LayoutHandler layoutHandler; 
    if(row == null) 
    { 
     LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = layoutInflater.inflate(R.layout.row_layout, parent, false); 
     layoutHandler = new LayoutHandler(); 
     layoutHandler.NAME = (TextView) row.findViewById(R.id.text_user_name); 
     layoutHandler.LASTNAME = (TextView) row.findViewById(R.id.text_user_last); 
     row.setTag(layoutHandler); 

    } 
    else 
    { 
     layoutHandler = (LayoutHandler) row.getTag(); 


    } 
    DataProvider dataProvider = (DataProvider) this.getItem(position); 
    layoutHandler.NAME.setText(dataProvider.getName()); 
    layoutHandler.LASTNAME.setText(dataProvider.getLastName()); 

    return row; 


}} 
+0

Не могли бы вы показать нам класс ListDataAdapter? –

+0

Прежде всего, передавая строку новому действию, убедитесь, что ваш ключ имеет ТОЧНО ту же орфографию. Я вижу, что вы написали «Имя», «Последний», «Телефон» в одном действии и «Имя», «Последний», «Телефон» в другом –

+0

@aqm, да, конечно, я добавил его. – szentmihaly

ответ

1
listDataAdapter.add(dataProvider); 

Я думаю, вы должны добавить dataProvider (то есть данные, которые вы хотите добавить в свой список) в ArrayList, а не в свой пользовательский адаптер.

Вместо этого вы связываете пользовательский адаптер с ArrayList и ListView для визуализации.

1

Зачем вам нужна эта линия?

String data = (String) parent.getItemAtPosition(position); 

Вы не используете эту переменную нигде, и эта линия дает вам эту ошибку (возможно).

Также я думаю, что вы должны использовать view.findViewById вместо findViewById внутри прослушивателя onItemClick.

+0

Я просто забыл удалить/прокомментировать эту строку из предыдущей, которую я пробовал. Он не работает, когда я удаляю его, ни когда я пытаюсь использовать view.findViewById. – szentmihaly

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