【问题标题】:Passing ListView item clicked between activities传递在活动之间单击的 ListView 项目
【发布时间】:2016-08-23 12:19:15
【问题描述】:

我的主要活动有一个从数据库获取数据的列表视图。

我遇到的问题是根据用户在列表中选择的内容将文本传递给下一个活动。

我正在获取列表视图以打开下一个活动并将一些奇怪的字符串发送到下一个活动,但发送的信息不正确。这是我的代码:

主要活动代码:

package com.example.chris.gymtracker;

import android.content.Intent;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;


public class Days extends AppCompatActivity {
    dbAddDays dbAddDays;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_days);
        dbAddDays = new dbAddDays(this);
        final ListView daysListView = (ListView) findViewById(R.id.daysListView);
        String[] fromFieldNames = new String[]{dbAddDays.ADDDAYS_KEY_DAYS};

        Button addDaysButton = (Button) findViewById(R.id.addDaysButton);
        Button refreshButton = (Button)findViewById(R.id.refreshButton);

        addDaysButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent startAddDaysActivity = new Intent(Days.this, addDays.class);
                startActivity(startAddDaysActivity);
            }
        });
        refreshButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                populateDaysListView();
            }
        });

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1, fromFieldNames);
        daysListView.setAdapter(adapter);
        daysListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id){
                Intent myIntent = new Intent(view.getContext(),selectWorkout.class);
                String s = daysListView.getItemAtPosition(position).toString();
                myIntent.putExtra("itemSelected",s);

                startActivityForResult(myIntent,position);
            }
        });
    }
    public void populateDaysListView() {
        Cursor cursor = dbAddDays.getDaysData();
        String[] fromFieldNames = new String[]{dbAddDays.ADDDAYS_KEY_DAYS};
        int[] toViewIDs = new int[]{R.id.addDaysDaysTextView};
        SimpleCursorAdapter myCursorAdapter;
        myCursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.activity_add_day_text_view, cursor, fromFieldNames, toViewIDs, 0);
        ListView myList = (ListView) findViewById(R.id.daysListView);
        myList.setAdapter(myCursorAdapter);
    }
}

第二个活动代码:

package com.example.chris.tracker;

import android.content.Intent;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class selectWork extends AppCompatActivity {
    dbAddDays dbAddDays;
    Days Days;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_work);
        Intent intentExtras = getIntent();
        //Bundle bun = intentExtras.getExtras();
        String s = intentExtras.getStringExtra("itemSelected");
        TextView textView = (TextView)findViewById(R.id.textView3);
        textView.setText(s);
        dbAddDays = new dbAddDays(this);
        populateWorkoutGridView();
    }
    public void populateWorkGridView() {
        Cursor cursor = dbAddDays.getWorkoutData();
        String[] fromFieldNames = new String[]{dbAddDays.ADDDAYS_KEY_WORKOUT};
        int[] toViewIDs = new int[]{R.id.workoutWorkoutTextView};
        SimpleCursorAdapter myCursorAdapter;
        myCursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.activity_workout_text_view, cursor, fromFieldNames, toViewIDs, 0);
        GridView myGrid = (GridView) findViewById(R.id.workoutGridView);
        myGrid.setAdapter(myCursorAdapter);
    }
}

问题:

Everything here works fine

But that bold Android. ... text view should show the text of the item clicked.

【问题讨论】:

  • 您在同一个列表视图上有两个不同的适配器。我建议你坚持使用 CursorAdapter

标签: java android listview android-intent


【解决方案1】:

由于您使用的是 CursorAdapter,因此 getItemAtPosition 调用将返回光标对象,如在该对象上调用 toString() 所见。

试试下面的代码。它尝试检索游标对象,然后从 fromFieldNames 数组中按列名获取数据。

Cursor cursor = (Cursor)daysListView.getItemAtPosition(position);
cursor.getString(cursor.getColumnIndex(fromFieldNames[column]))

【讨论】:

    【解决方案2】:

    试试这个:

    Intent myIntent = new Intent(view.getContext(),selectWorkout.class);
    myIntent.putExtra("itemSelected", fromFieldNames[position]);
    startActivityForResult(myIntent,position);
    

    【讨论】:

    • @ChrisS 我的回答对你有帮助吗?
    • @ChrisS 如果对您有帮助,请接受我的回答。
    • 这不起作用,可能会导致数组越界异常。 fromFieldNames 是一个包含一个元素的静态数组,如果用户选择列表中第一行数据以外的任何内容,则会失败。
    • 你传递了数据库中的列名,而不是实际值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多