【问题标题】:Pass data from a ListView to another Listview将数据从 ListView 传递到另一个 Listview
【发布时间】:2013-03-03 19:50:08
【问题描述】:

我有一个从 SqLite Db 获取数据的列表视图。我需要获取在列表视图中被点击的数据并将其显示在列表视图的另一个活动中。

我尝试过使用共享首选项,但一次只能获取一个数据并将其作为文本视图显示在另一个活动中。

我不知道如何在列表视图中全部显示所选数据或从所选数据创建列表视图,需要帮助。

我的搜索活动

  listContent1.setAdapter(cursorAdapter);
  listContent1.setOnItemClickListener(listContentOnItemClickListener); 



             private ListView.OnItemClickListener listContentOnItemClickListener = new ListView.OnItemClickListener(){
  public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

      Cursor cursor = (Cursor) parent.getItemAtPosition(position);

      String item_content1 = cursor.getString(cursor.getColumnIndex(SQLiteAdapter.KEY_FOODNAME));
      String item_content2 = cursor.getString(cursor.getColumnIndex(SQLiteAdapter.KEY_CALORIES));
      arlene = arlene + Integer.parseInt(item_content2);
      String item = String.valueOf(" Food Name: " + item_content1 ) + "\n" +
              " Calories: " +  item_content2;

       Toast.makeText(Search.this, item, Toast.LENGTH_LONG).show();      

       food.setText(item_content1);
       calories.setText(String.valueOf(arlene));


       Intent myIntent = new Intent(Search.this, Foodlog.class);
       Bundle bundle = new Bundle();
       bundle.putString("SQLITEDATA1", food.getText().toString()); 
       bundle.putString("SQLITEDATA2", calories.getText().toString()); 
       myIntent.putExtras(bundle);
       startActivity(myIntent); 
  } 

这是我的食物记录活动

  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.foodlog);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

     foodnum = (TextView)findViewById(R.id.foodNum);
     remaining = (TextView)findViewById(R.id.remainingNum);
     totalnum = (TextView)findViewById(R.id.totalNum);  
     foodlog = (ListView)findViewById(R.id.list);

      Bundle bundle = getIntent().getExtras();  
       if( bundle != null){
       String food = bundle.getString("SQLITEDATA1");
       String calories = bundle.getString("SQLITEDATA2");

       String[] values = new String[] { food, calories }; //That you got from your intent bundle
       LVAdapter adapter = new LVAdapter(this, R.layout.foodlist, values);
       setListAdapter(adapter);

       }

希望你能帮助我

03-04 23:40:18.572: E/AndroidRuntime(451): FATAL EXCEPTION: main
03-04 23:40:18.572: E/AndroidRuntime(451): java.lang.RuntimeException: Unable to        start activity ComponentInfo{me.mojica.caloriewatch/me.mojica.caloriewatch.Foodlog}:  java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.os.Looper.loop(Looper.java:123)
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-04 23:40:18.572: E/AndroidRuntime(451):  at java.lang.reflect.Method.invokeNative(Native Method)
03-04 23:40:18.572: E/AndroidRuntime(451):  at java.lang.reflect.Method.invoke(Method.java:521)
03-04 23:40:18.572: E/AndroidRuntime(451):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-04 23:40:18.572: E/AndroidRuntime(451):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-04 23:40:18.572: E/AndroidRuntime(451):  at dalvik.system.NativeStart.main(Native Method)
03-04 23:40:18.572: E/AndroidRuntime(451): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
03-04 23:40:18.572: E/AndroidRuntime(451):  at  android.app.ListActivity.onContentChanged(ListActivity.java:245)
03-04 23:40:18.572: E/AndroidRuntime(451):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:201)
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.app.Activity.setContentView(Activity.java:1647)
03-04 23:40:18.572: E/AndroidRuntime(451):  at me.mojica.caloriewatch.Foodlog.onCreate(Foodlog.java:22)
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-04 23:40:18.572: E/AndroidRuntime(451):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

我已根据答案对此进行了编辑。我仍然无法让它运行。请帮忙。

【问题讨论】:

  • 为第二个活动附加一个带有“Intent”的“Bundle”。
  • 我试过了,但我怎样才能从中创建一个列表视图?请帮帮我。
  • 我会帮你的,你先把问题归零?
  • 我需要获取 onitemclick 上的数据并将其传递给其他活动,然后从该单击的项目中,我需要从中创建一个列表视图。
  • 您的第一个列表视图包含哪些数据?如果您在 Paint 中的第一个 Listview 并附上问题,您可以绘制和图像吗?

标签: android listview


【解决方案1】:

当您单击 ListView 项目时,您使用 Intent 将带有数据的 Extra 包传递给您的下一个活动。

Intent myIntent = new Intent(currentActivity.this, secondActivity.class);
myIntent.putExtra("SQLITEDATA1", food.getText().toString()); 
myIntent.putExtra("SQLITEDATA2", calories.getText().toString()); 
startActivity(myIntent); 

使用这些数据,您应该通过制作自定义 ListView 适配器来填充 ListView。

public class SimpleArrayAdapter extends ArrayAdapter<String> {
  private final Context context;
  private final String[] values;

  public SimpleArrayAdapter(Context context, String[] values) {
    super(context, R.layout.rowlayout, values);
    this.context = context;
    this.values = values;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.rowlayout, parent, false);
    TextView textView = (TextView) rowView.findViewById(R.id.label);        
    textView.setText(values[position]);     
    return rowView;
  }
} 

在您的其他 Activity 中填充 ListView:

public class MyListActivity extends ListActivity {
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    String food = myIntent.getStringExtra("SQLITEDATA1");
    String calories = myIntent.getStringExtra("SQLITEDATA2");
    String[] values = new String[] { food, calories }; //That you got from your intent bundle
    SimpleArrayAdapter adapter = new SimpleArrayAdapter(this, values);
    setListAdapter(adapter);
  }

} 

我推荐reading this entire tutorial

【讨论】:

  • 我将在意图中传递什么数据先生?我很抱歉。我是 thiw 的超级新手,listview 适配器是我的头等舱还是我会为此制作另一个?
  • @michelle.mo 看起来您正在将点击的数据保存在 Shared Preference 中,然后在下一个活动中再次读取。如果是这样,您应该使用 Intent。
  • 对不起,先生们。我不知道如何传递数据,从我阅读的内容来看,他们建议共享首选项
  • 嘿先生,我可以得到你的电子邮件地址或其他什么,拜托。我需要帮助,我的项目很糟糕。
  • 再检查一次我的编辑。仔细看看我如何将 2 个字符串(卡路里和食物)传递给新的 Activity。如果您想在关闭应用程序时保存数据,您应该只使用共享首选项。但是如果可以取回数据,使用自定义适配器仍然是一样的。
猜你喜欢
  • 2019-07-10
  • 2015-06-10
  • 2017-12-02
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2016-01-18
相关资源
最近更新 更多