2014-08-29 49 views
3

我目前正在研究一個應用程序,其中包含登錄時的朋友列表和用戶配置文件。當用戶點擊朋友列表中的朋友時,我希望他們被引導至該朋友的個人資料頁面。爲此,我一直試圖從列表視圖中單擊的用戶提取特定對象ID,然後將其傳遞到下一個活動,我使用它來運行所有用戶的查詢其他屬性(名稱,電子郵件,家鄉等)。我已經想出瞭如何通過意圖傳遞數據,但我從點擊列表項獲取用戶標識時遇到各種麻煩。我的onItemCLick代碼如下。從onListItemClick獲取分析對象ID

```

public void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    ParseObject item = (ParseObject) l.getAdapter().getItem(position); 
    String objectID = item.getObjectId().toString(); 

    Intent intent = new Intent(getActivity(), FriendsProfileActivity.class); 
    intent.putExtra("ID", objectID); 
    startActivity(intent); 

```

我也嘗試過這種東西沒有用的。

```

public void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    ParseObject item = (ParseObject) l.getAdapter().getItem(position); 
    item.saveInBackground(new SaveCallback() { 
     @Override 
     public void done(ParseException e) { 
      if(e == null) { 
       String objectID = item.getObjectId(); 
       Log.e(TAG, objectID); 

       Intent intent = new Intent(getActivity(), FriendsProfileActivity.class); 
       intent.putExtra("ID", objectID); 
       startActivity(intent); 
       } 
       else { 
        Log.e(TAG, e.getMessage()); 
       } 
      } 
     }); 

    } 

```

在這兩種情況下,應用程序崩潰,當我點擊列表視圖中的用戶。我怎樣才能成功地從用戶點擊的對象ID,並將其傳遞?

編輯:這是logcat錯誤。

Process: com.richluick.ribbit, PID: 2194 java.lang.ClassCastException: java.lang.String cannot be cast to com.parse.ParseObject at com.richluick.ribbit.FriendsFragment.onListItemClick(FriendsFragment.java:83) at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58) at android.widget.AdapterView.performItemClick(AdapterView.java:299) at android.widget.AbsListView.performItemClick(AbsListView.java:1113) at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904) at android.widget.AbsListView$3.run(AbsListView.java:3638) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method)

編輯:這是包括查詢和列表適配器活動的完整代碼。 package com.richluick.ribbit;

import android.app.AlertDialog; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import com.parse.FindCallback; 
import com.parse.ParseException; 
import com.parse.ParseObject; 
import com.parse.ParseQuery; 
import com.parse.ParseRelation; 
import com.parse.ParseUser; 
import com.parse.SaveCallback; 

import java.util.List; 

public class FriendsFragment extends android.support.v4.app.ListFragment { 

    public static final String TAG = FriendsFragment.class.getSimpleName(); 

    protected List<ParseUser> mFriends; 
    protected ParseRelation<ParseUser> mFriendsRelation; 
    protected ParseUser mCurrentUser; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_friends, container, false); 
     return rootView; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     mCurrentUser = ParseUser.getCurrentUser(); 
     mFriendsRelation = mCurrentUser.getRelation(ParseConstants.KEY_FRIENDS_RELATION); 

     getActivity().setProgressBarIndeterminateVisibility(true); 

     ParseQuery<ParseUser> query = mFriendsRelation.getQuery(); 
     query.addAscendingOrder(ParseConstants.KEY_USERNAME); 
     query.findInBackground(new FindCallback<ParseUser>() { 
      @Override 
      public void done(List<ParseUser> friends, ParseException e) { 
       getActivity().setProgressBarIndeterminateVisibility(false); 

       if (e == null) { 
        mFriends = friends; 

        String[] usernames = new String[mFriends.size()]; 
        int i = 0; 
        for (ParseUser user : mFriends) { 
         usernames[i] = user.getUsername(); 
         i++; 
        } 
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getListView().getContext(), 
        android.R.layout.simple_list_item_1, usernames); 
        setListAdapter(adapter); 
       } 
       else { 
        Log.e(TAG, e.getMessage()); 
        AlertDialog.Builder builder = new AlertDialog.Builder(getListView().getContext()); 
        builder.setTitle(R.string.error_title) 
          .setMessage(e.getMessage()) 
          .setPositiveButton(android.R.string.ok, null); 
        AlertDialog dialog = builder.create(); 
        dialog.show(); 
       } 
      } 
     }); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

     final ParseObject item = (ParseObject) l.getAdapter().getItem(position); 
     item.saveInBackground(new SaveCallback() { 
      @Override 
      public void done(ParseException e) { 
       if(e == null) { 
        String objectID = item.getObjectId(); 
        Log.e(TAG, objectID); 

        Intent intent = new Intent(getActivity(), FriendsProfileActivity.class); 
        intent.putExtra("ID", objectID); 
        startActivity(intent); 
       } 
       else { 
        Log.e(TAG, e.getMessage()); 
       } 
      } 
     }); 

} 

}

+0

請發佈您的logcat – MrEngineer13 2014-08-29 18:38:24

+0

後Yout LogCat看到的exeption或錯誤。 – 2014-08-29 19:21:41

+0

請在活動中發佈其餘代碼 - 即,查詢並加載列表視圖的代碼。這有助於理解你的問題 - logcat錯誤似乎意味着適配器中的內容是以字符串開始的,而不是ParseObjects – user2163298 2014-08-29 21:50:19

回答

2

看一看ParseQueryAdapter

文檔:https://parse.com/docs/android_guide#ui-queryadapter

教程:https://parse.com/tutorials/parse-query-adapter

API:https://parse.com/docs/android/api/com/parse/ParseQueryAdapter.html

另外我會推薦EventBus將ParseObject傳遞給下一個活動https://github.com/greenrobot/EventBus

然後,你可以這樣做:

適配器:

Intent intent = new Intent(getActivity(), FriendsProfileActivity.class); 
EventBus.getDefault().postSticky(YourParseObject); 
startActivity(intent); 

港九FriendsProfileActivity:

ParseObject yourParseObject = EventBus.getDefault().getStickyEvent(ParseObject.class); 

如果你移動到使用parse.com子類,那麼任何一個子類可以是通過這種方式通過EventBus發送。

爲R.layout佈局: -

示例代碼你想

的ParseQueryAdapter什麼未經檢驗,但應接近。adapter_item_friend - 可定製,但沒有看中這裏

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:paddingTop="5dp"> 


    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:text="item" /> 

</RelativeLayout> 

適配器:

public class ParseUserFriendsAdapter extends ParseQueryAdapter<ParseUser> { 

    private static final String TAG = ParseUserFriendsAdapter.class.getSimpleName(); 

    public ParseUserFriendsAdapter(Context context) { 
     super(context, new ParseQueryAdapter.QueryFactory<ParseUser>() { 

      @Override 
      public ParseQuery<ParseUser> create() { 
       ParseUser currentUser = ParseUser.getCurrentUser(); 
       ParseRelation<ParseUser> friendsRelation = currentUser.getRelation(ParseConstants.KEY_FRIENDS_RELATION); 
       ParseQuery<ParseUser> query = friendsRelation.getQuery(); 
       query.addAscendingOrder(ParseConstants.KEY_USERNAME); 
       return query; 
      } 
     }); 
    } 

    @InjectView(R.id.text) TextView text; 

    @Override 
    public View getItemView(final ParseUser user, View v, ViewGroup parent) { 

     if (v == null) { 
      v = View.inflate(getContext(), R.layout.adapter_item_friend, 
        null); 
     } 

     super.getItemView(user, v, parent); 

     ButterKnife.inject(this, v); 

     text.setText(user.getUsername()); 


     return v; 

    } 

} 

我使用含有一個ListView常規片段在它的佈局:

R.layout.yourfriendslistlayout :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:animateLayoutChanges="true" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@+id/listview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:choiceMode="singleChoice" 
     android:dividerHeight="1dp" /> 

</LinearLayout> 

的代碼片段中的重要組成部分:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    Log.d(TAG, "onCreate"); 

    mAdapter = new ParseUserFriendsAdapter(getActivity()); 

    super.onCreate(savedInstanceState); 
} 

@InjectView(R.id.listview) ListView mListView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(
      R.layout.yourfriendslistlayout, container, false); 

    ButterKnife.inject(this, rootView); 

    /** Setting the list adapter for the ListFragment */ 
    mListView.setAdapter(mAdapter); 
    mListView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

      // Now it is easy to get the ParseObject that is clicked 
      ParseUser friend = mAdapter.getItem(position); 

      Toast.makeText(getActivity(), "clicked " + friend.getObjectId(), Toast.LENGTH_SHORT).show(); 

      EventBus.getDefault().postSticky(friend); 

      Intent intent = new Intent(getActivity(), 
        FriendsProfileActivity.class); 
      startActivity(intent); 

     } 
    }); 
    return rootView; 
} 

可選除了片段代碼:

/* 
*This last part automatically sets the load indicator whenever parse performs a query 
*/ 
private final OnQueryLoadListener<ParseUser> queryListener = new OnQueryLoadListener<ParseUser>() { 

    @Override 
    public void onLoaded(List<ParseUser> arg0, Exception arg1) { 
     getActivity().setProgressBarIndeterminateVisibility(Boolean.FALSE); 
    } 

    @Override 
    public void onLoading() { 
     getActivity().setProgressBarIndeterminateVisibility(Boolean.TRUE); 
    } 
}; 

@Override 
public void onResume() { 
    mAdapter.addOnQueryLoadListener(queryListener); 
    super.onResume(); 
} 

@Override 
public void onPause() { 
    mAdapter.removeOnQueryLoadListener(queryListener); 
    super.onPause(); 
} 
+0

感謝您的信息和鏈接。當我想進一步自定義查詢結果時,這一切似乎都很棒。然而,在我得到這個遙遙領先之前,我需要一種方法從listview中點擊的userobject中提取對象ID,並將它存儲在一個變量中,然後傳遞。你對此有何看法?謝謝。 – 2014-08-29 20:05:00

+0

此答案不回答OP的問題 – user2163298 2014-08-29 21:38:11

+1

@ user2163298是的,它的確如此。它爲每個列表項添加一個parseobject。稍後會舉出一個例子。現在不在我的計算機 – cYrixmorten 2014-08-29 21:55:46

1

簡單的使用您的列表項的TextView,並在getItemView對象的對象ID來填充它(),並將其可見性設置爲View.GONE

然後在onItemClickListener中,調用此textview的getText()。

通過這種方式,您可以在您的方法中獲取objectId並將其與意圖一起傳遞。