2016-10-21 30 views
0

我有电话簿应用程序,它将新联系人存储在sqlite表中。我有活动添加和(列表)查看联系人,他们工作得很好。
现在,我需要一个Details活动,它将显示listView中cliked的详细联系方式。 我知道我应该使用onItemClickListener(),但是我尝试过的所有内容都不起作用。详细信息Activity包含三个TextViews(名称,姓氏,电话)。
所有我能得到一个错误:如何将点击项目的数据与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,而不是仅仅在onItemClick监听器中的findViewById。

+0

我只是忘记删除/评论这条线以前我曾尝试过的东西。当我删除它时,它不工作,当我尝试使用view.findViewById时。 – szentmihaly

相关问题