【问题标题】:how to pass clicked item's data with onItemClickListener() to another activity如何使用 onItemClickListener() 将单击项目的数据传递给另一个活动
【发布时间】:2016-10-21 14:36:50
【问题描述】:

我有电话簿应用程序,可以在 sqlite 表中存储新联系人。我有要添加和(列出)查看联系人的活动,他们工作得很好。
现在,我需要一个 Details 活动,它将显示在 listView 中单击的联系人的详细信息。 我知道我应该使用onItemClickListener(),但是我尝试过的一切都不起作用。详细信息 Activity 包含三个 TextView(姓名、姓氏、电话)。
我只能得到一个错误:

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;


}}

【问题讨论】:

  • 你能告诉我们 ListDataAdapter 类吗?
  • 首先,将字符串传递给新活动时,请确保您的密钥具有完全相同的拼写。我看到您在一个活动中写了“姓名”、“姓氏”、“电话”,而在另一个活动中写了“姓名”、“姓氏”、“电话”
  • @aqm ,是的,当然,我已经添加了。

标签: java android listview android-intent onitemclicklistener


【解决方案1】:
listDataAdapter.add(dataProvider);

我认为您必须将 dataProvider(这是您要添加到列表中的数据)添加到 ArrayList 而不是您的自定义适配器。

相反,您将自定义适配器关联到 ArrayList 和 ListView 以进行可视化。

【讨论】:

    【解决方案2】:

    为什么需要这条线?

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

    您没有在任何地方使用该变量,并且该行给您该错误(可能)。

    另外我认为你应该在 onItemClick 监听器中使用 view.findViewById 而不是 findViewById。

    【讨论】:

    • 我只是忘记从我之前尝试过的内容中删除/评论该行。当我删除它时它不起作用,当我尝试使用 view.findViewById 时也不起作用。
    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2011-11-07
    相关资源
    最近更新 更多