【问题标题】:Android - How to make an Activity for each item in a ListView and pass Java Object to next screenAndroid - 如何为 ListView 中的每个项目创建一个 Activity 并将 Java 对象传递到下一个屏幕
【发布时间】:2014-04-09 15:54:44
【问题描述】:

我有一个联系人列表视图,每个联系人都是一个 Java 对象,其中包含大量相关信息。其中一些信息显示在 ListView 中,但其余信息用于 DetailView。我正在尝试编写一种方法,该方法将我点击的任何联系人带到 DetailView,但我还需要随身携带该对象。我将所有联系人存储在 MainActivity.java 的 ArrayList 中

我的问题:我是否需要随身携带联系人对象,或者实际上是否有某种方法可以在另一个 Activity 中访问我的 ArrayList? 如果我可以/必须随身携带它,我该怎么做,因为 putExtra() 方法不将对象作为参数。

我的 MainActivity 的开头是这样的:

public class MainActivity extends Activity implements AdapterView.OnItemClickListener {

ListView list;

我现在有一个非常基本的 onClickListener,但不知道该放什么:

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    Intent intent = new Intent(MainActivity.this, DetailView.class);
    intent.putExtra("contact", i);
    startActivity(intent);
}  

我觉得我对 MainActivity 类的初始定义与 onItemClick 方法或其他方法不对应,这就是它没有执行并将我带到另一个屏幕的原因。

【问题讨论】:

  • 每个项目都有一个活动??你会发疯的!如果您有 50 件商品..我不想看到结果。在您的情况下选择Fragments:developer.android.com/training/basics/fragments/index.html
  • 很抱歉,由于我是新手,我可能没有正确地表达这个问题。我想要的只是单击每个联系人并转到它的 DetailView。 DetailView 已经编写好了,只会在其字段中填充联系人的信息。
  • 那么你有ActivityA和ActivityB,你不需要为每个项目添加其他的吗?你让我放心:)
  • 是的,对不起,我就是这个意思。而ActivityB只是一个被填写的模板。
  • 我在下面看到两个答案,他们只是传递用户 ID 或 id 这是要走的路。用 android 传递一个类是相当困难的,而你最终得到的是该类的一个副本。这是使用 android 将类发送到意图的示例。 stackoverflow.com/questions/21295328/…

标签: java android listview


【解决方案1】:

只需使用Intent.putExtra() 传递信息,使用getIntent().getExtras() 接收信息。

// call a new intent
myIntent = new Intent(ActivityA.this, ActivityB.class);  
// put an extra (like this following string)  
String userid = "User A";
myIntent.putExtra("TAG_CONTACT_ID", userid);  
startActivity(myIntent);

// receive the info in your onCreate method in ActivityB
Bundle extras = getIntent().getExtras();
if(extras != null) {
    String newUserID = extras.getString("TAG_CONTACT_ID");
}

请参阅this short example 了解更多信息。

如果你想传递一个整数,你可以这样做:myIntent.putExtra("value", i); 并带上它:int myValue = extras.getInt("value");

希望对您有所帮助。

【讨论】:

    【解决方案2】:
    Intent intent = new Intent(ActivityA.this, DetailView.class);
    intent.putExtra("extra_name","extra");
    startActivity(intent);
    

    然后在另一个活动中:

    /*onCreate*/
    Object extra = getIntent().getExtra().get("extra_name");
    

    我建议传递某种指向描述的 ID,不建议传递带有意图的复杂数据结构

    【讨论】:

    • 我将如何实现 ID 的东西?因为你是对的,如果我尝试写 intent.putExtra("contact", contacts.get(i)); 会导致错误。
    • contacts 是一个复杂类型(一个类)。我们是在谈论您创建的 Android 联系人还是自定义类?如果你创建了这个类,你如何识别每个条目?它可能是名字或电子邮件,并不重要。如果要传递复杂类型,则必须了解 Parcelable :developer.android.com/reference/android/os/Parcelable.html
    • 我想通了,谢谢。现在我的问题是,无论出于何种原因,点击一个联系人实际上并没有将我带到一个新屏幕。
    • 您是否已将新活动添加到清单中?然后我忘记做很多xD
    • 因为我在 Eclipse 中,所以它是自动生成的。看起来像这样:&lt;activity android:name="com.example.contacts.DetailView" android:label="@string/title_activity_detail_view" &gt; &lt;/activity&gt; 是不是漏掉了什么?
    【解决方案3】:

    试试这样的:

    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
    
        Contact c = (Contact)contacts.get(position);
        Intent i = new Intent();
    
        i.putExtras("contact", c);
        i.setClass(this, Activity2.class);
        startActivity(i);
    }
    

    【讨论】:

      【解决方案4】:

      用parcelable创建java对象

      检查以下代码以在 Android 中创建 Parcelable 对象。

      public class ObjFeedImages implements Parcelable {
      
          public int image_id;
          public boolean like_status = false;
          public String image_url = null;
      
          @Override
          public int describeContents() {
              return 0;
          }
      
          @Override
          public void writeToParcel(Parcel dest, int flags) {
              dest.writeStringArray(new String[] {
                      String.valueOf(image_id),
                      String.valueOf(like_status),
                      image_url, });
      
          }
      
          public ObjFeedImages(Parcel in) {
      
              String[] data = new String[3];
              int i = 0;
              in.readStringArray(data);
      
              image_id = Integer.parseInt(data[i++]);//
              like_status = Boolean.parseBoolean(data[i++]);
              image_url = data[i++];
      
          }
      
          public static final Parcelable.Creator<ObjFeedImages> CREATOR = new Parcelable.Creator<ObjFeedImages>() {
              @Override
              public ObjFeedImages createFromParcel(Parcel source) {
                  try {
                      return new ObjFeedImages(source);
                  } catch (Exception e) {
                      e.printStackTrace();
                      return null;
                  }
              }
      
              @Override
              public ObjFeedImages[] newArray(int size) {
                  try {
                      return new ObjFeedImages[size];
                  } catch (Exception e) {
                      e.printStackTrace();
                      return null;
                  }
              }
          };
      
      }
      

      在创建一些此类对象的列表后说

      ObjFeedImages object = new ObjFeedImages();
      object.image_id = 1;
      object.like_status = true;
      object.image_url="http://some image url";
      
      
      
      Intent intent = new Intent(/*Your Intent Info*/);
      intent.putExtras("key_name",object);
      startActivity(intent);
      

      Here 是完整的描述。

      要在其他活动中检索对象,您必须编写以下代码。

      ObjFeedImages objectOnOtherActivity = (ObjFeedImages)getIntent().getParcelableExtra("key_name");
      

      准备好享受代码了。 快乐的编码......

      【讨论】:

        猜你喜欢
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 2015-09-05
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多