Android 从ArrayAdapter开始的片段
我有4个片段用于我的应用程序。我的一个片段(聊天列表)有一个ListView,它使用扩展ArrayAdapter的适配器。现在在我的ArrayAdapter类中,当单击某一行时,我想打开我的CurrentChat片段。我该怎么办?在我看来,似乎只能从活动和其他片段访问片段 ChatList.javaAndroid 从ArrayAdapter开始的片段,android,android-fragments,fragment,Android,Android Fragments,Fragment,我有4个片段用于我的应用程序。我的一个片段(聊天列表)有一个ListView,它使用扩展ArrayAdapter的适配器。现在在我的ArrayAdapter类中,当单击某一行时,我想打开我的CurrentChat片段。我该怎么办?在我看来,似乎只能从活动和其他片段访问片段 ChatList.java package com.example.jj.fragments; import android.database.DataSetObserver; import android.os.Bundl
package com.example.jj.fragments;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;
/**
* Created by jj on 11/23/2015.
*/
public class ChatList extends Fragment {
public static final String ARG_PAGE = "ARG_PAGE";
ListView chatListLV;
ChatListAdapter adapter;
public static ChatList newInstance(int page) {
Bundle args = new Bundle();
args.putInt(ARG_PAGE, page);
ChatList fragment = new ChatList();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// Inflate the fragment layout we defined above for this fragment
// Set the associated text for the title
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.chatlist, container, false);
chatListLV = (ListView) view.findViewById(R.id.chatLV);
adapter = new ChatListAdapter(getContext(),R.layout.single_chatlist_row);
chatListLV.setAdapter(adapter);
chatListLV.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
chatListLV.setSelection(adapter.getCount() - 1);
}
});
fillChatList();
return view;
}
public void fillChatList(){
DBHelper db = new DBHelper(getActivity());
db.getChatList(adapter);
db.close();
}
}
package com.example.jj.fragments;
/**
* Created by jj on 11/28/2015.
*/
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import io.socket.client.IO;
import io.socket.client.Socket;
public class ChatListAdapter extends ArrayAdapter<ChatListDataProvider>{
public Socket mSocket;
{
try {
mSocket = IO.socket("https://great-sarodh.c9.io/");
}
catch (URISyntaxException e){}
}
private static final String TAG = "ChatListAdapter" ;
public List<ChatListDataProvider> chat_list = new ArrayList<ChatListDataProvider>();
private TextView dateTV;
private TextView messageTV;
private TextView timeTV;
private TextView sideTV;
private ImageView PictureIV;
private String gcmID;
private String androidID;
private String roomhash;
private int side;
CurrentChat CCFrag;
int type;
Context CTX;
public ChatListAdapter(Context context, int resource) {
super(context, resource);
CTX = context;
}
@Override
public void add(ChatListDataProvider object){
chat_list.add(object);
super.add(object);
}
@Override
public int getCount() {
return chat_list.size();
}
@Override
public ChatListDataProvider getItem(int position) {
return chat_list.get(position);
}
@Override public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null){
LayoutInflater inflator = (LayoutInflater) CTX.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflator.inflate(R.layout.single_chatlist_row,parent,false);
}
sideTV = (TextView) convertView.findViewById(R.id.sideTV);
messageTV = (TextView) convertView.findViewById(R.id.lastmsgTV);
timeTV = (TextView) convertView.findViewById(R.id.timeTV);
ChatListDataProvider provider = chat_list.get(position);
gcmID = provider.gcmID;
messageTV.setText(provider.lastMsg);
timeTV.setText(provider.time);
side = provider.side;
if(side == 0){
sideTV.setText("Who?:");
}
else if(side == 1){
sideTV.setText("You:");
}
roomhash = provider.roomID;
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stuck
Log.d(TAG, "JOINING ROOMID" + chat_list.get(position).roomID);
mSocket.emit("CreateRoom", chat_list.get(position).roomID, chat_list.get(position).gcmID);
//THE CODE TO OPEN CURRENTCHAT FRAGMENTS SHOULD GO HERE
}
});
notifyDataSetChanged();
return convertView;
}
}
package com.example.jj.fragments;
import android.support.v4.app.FragmentActivity;
/**
* Created by jj on 11/28/2015.
*/
public class ChatListDataProvider extends FragmentActivity{
public String roomID;
public String gcmID;
public String lastMsg;
public String date;
public String time;
public int side;
private ChatAdapter chat;
public ChatListDataProvider (String gcmID) {
super();
}
public ChatListDataProvider (String roomID, String gcmID, String lastMsg, int side, String time, String date) {
this.roomID = roomID;
this.gcmID = gcmID;
this.lastMsg = lastMsg;
this.side = side;
this.date = date;
}
}
package com.example.jj.fragments;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class CurrentChat extends Fragment {
public static final String ARG_PAGE = "ARG_PAGE";
public static CurrentChat newInstance(int page) {
Bundle args = new Bundle();
args.putInt(ARG_PAGE, page);
CurrentChat fragment = new CurrentChat();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.currentchat, container, false);
return view;
}
}
ChatListAdapter.java
package com.example.jj.fragments;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;
/**
* Created by jj on 11/23/2015.
*/
public class ChatList extends Fragment {
public static final String ARG_PAGE = "ARG_PAGE";
ListView chatListLV;
ChatListAdapter adapter;
public static ChatList newInstance(int page) {
Bundle args = new Bundle();
args.putInt(ARG_PAGE, page);
ChatList fragment = new ChatList();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// Inflate the fragment layout we defined above for this fragment
// Set the associated text for the title
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.chatlist, container, false);
chatListLV = (ListView) view.findViewById(R.id.chatLV);
adapter = new ChatListAdapter(getContext(),R.layout.single_chatlist_row);
chatListLV.setAdapter(adapter);
chatListLV.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
chatListLV.setSelection(adapter.getCount() - 1);
}
});
fillChatList();
return view;
}
public void fillChatList(){
DBHelper db = new DBHelper(getActivity());
db.getChatList(adapter);
db.close();
}
}
package com.example.jj.fragments;
/**
* Created by jj on 11/28/2015.
*/
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import io.socket.client.IO;
import io.socket.client.Socket;
public class ChatListAdapter extends ArrayAdapter<ChatListDataProvider>{
public Socket mSocket;
{
try {
mSocket = IO.socket("https://great-sarodh.c9.io/");
}
catch (URISyntaxException e){}
}
private static final String TAG = "ChatListAdapter" ;
public List<ChatListDataProvider> chat_list = new ArrayList<ChatListDataProvider>();
private TextView dateTV;
private TextView messageTV;
private TextView timeTV;
private TextView sideTV;
private ImageView PictureIV;
private String gcmID;
private String androidID;
private String roomhash;
private int side;
CurrentChat CCFrag;
int type;
Context CTX;
public ChatListAdapter(Context context, int resource) {
super(context, resource);
CTX = context;
}
@Override
public void add(ChatListDataProvider object){
chat_list.add(object);
super.add(object);
}
@Override
public int getCount() {
return chat_list.size();
}
@Override
public ChatListDataProvider getItem(int position) {
return chat_list.get(position);
}
@Override public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null){
LayoutInflater inflator = (LayoutInflater) CTX.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflator.inflate(R.layout.single_chatlist_row,parent,false);
}
sideTV = (TextView) convertView.findViewById(R.id.sideTV);
messageTV = (TextView) convertView.findViewById(R.id.lastmsgTV);
timeTV = (TextView) convertView.findViewById(R.id.timeTV);
ChatListDataProvider provider = chat_list.get(position);
gcmID = provider.gcmID;
messageTV.setText(provider.lastMsg);
timeTV.setText(provider.time);
side = provider.side;
if(side == 0){
sideTV.setText("Who?:");
}
else if(side == 1){
sideTV.setText("You:");
}
roomhash = provider.roomID;
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stuck
Log.d(TAG, "JOINING ROOMID" + chat_list.get(position).roomID);
mSocket.emit("CreateRoom", chat_list.get(position).roomID, chat_list.get(position).gcmID);
//THE CODE TO OPEN CURRENTCHAT FRAGMENTS SHOULD GO HERE
}
});
notifyDataSetChanged();
return convertView;
}
}
package com.example.jj.fragments;
import android.support.v4.app.FragmentActivity;
/**
* Created by jj on 11/28/2015.
*/
public class ChatListDataProvider extends FragmentActivity{
public String roomID;
public String gcmID;
public String lastMsg;
public String date;
public String time;
public int side;
private ChatAdapter chat;
public ChatListDataProvider (String gcmID) {
super();
}
public ChatListDataProvider (String roomID, String gcmID, String lastMsg, int side, String time, String date) {
this.roomID = roomID;
this.gcmID = gcmID;
this.lastMsg = lastMsg;
this.side = side;
this.date = date;
}
}
package com.example.jj.fragments;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class CurrentChat extends Fragment {
public static final String ARG_PAGE = "ARG_PAGE";
public static CurrentChat newInstance(int page) {
Bundle args = new Bundle();
args.putInt(ARG_PAGE, page);
CurrentChat fragment = new CurrentChat();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.currentchat, container, false);
return view;
}
}
CurrentChat.java
package com.example.jj.fragments;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;
/**
* Created by jj on 11/23/2015.
*/
public class ChatList extends Fragment {
public static final String ARG_PAGE = "ARG_PAGE";
ListView chatListLV;
ChatListAdapter adapter;
public static ChatList newInstance(int page) {
Bundle args = new Bundle();
args.putInt(ARG_PAGE, page);
ChatList fragment = new ChatList();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
// Inflate the fragment layout we defined above for this fragment
// Set the associated text for the title
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.chatlist, container, false);
chatListLV = (ListView) view.findViewById(R.id.chatLV);
adapter = new ChatListAdapter(getContext(),R.layout.single_chatlist_row);
chatListLV.setAdapter(adapter);
chatListLV.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
adapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
chatListLV.setSelection(adapter.getCount() - 1);
}
});
fillChatList();
return view;
}
public void fillChatList(){
DBHelper db = new DBHelper(getActivity());
db.getChatList(adapter);
db.close();
}
}
package com.example.jj.fragments;
/**
* Created by jj on 11/28/2015.
*/
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import io.socket.client.IO;
import io.socket.client.Socket;
public class ChatListAdapter extends ArrayAdapter<ChatListDataProvider>{
public Socket mSocket;
{
try {
mSocket = IO.socket("https://great-sarodh.c9.io/");
}
catch (URISyntaxException e){}
}
private static final String TAG = "ChatListAdapter" ;
public List<ChatListDataProvider> chat_list = new ArrayList<ChatListDataProvider>();
private TextView dateTV;
private TextView messageTV;
private TextView timeTV;
private TextView sideTV;
private ImageView PictureIV;
private String gcmID;
private String androidID;
private String roomhash;
private int side;
CurrentChat CCFrag;
int type;
Context CTX;
public ChatListAdapter(Context context, int resource) {
super(context, resource);
CTX = context;
}
@Override
public void add(ChatListDataProvider object){
chat_list.add(object);
super.add(object);
}
@Override
public int getCount() {
return chat_list.size();
}
@Override
public ChatListDataProvider getItem(int position) {
return chat_list.get(position);
}
@Override public View getView(final int position, View convertView, ViewGroup parent) {
if(convertView == null){
LayoutInflater inflator = (LayoutInflater) CTX.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflator.inflate(R.layout.single_chatlist_row,parent,false);
}
sideTV = (TextView) convertView.findViewById(R.id.sideTV);
messageTV = (TextView) convertView.findViewById(R.id.lastmsgTV);
timeTV = (TextView) convertView.findViewById(R.id.timeTV);
ChatListDataProvider provider = chat_list.get(position);
gcmID = provider.gcmID;
messageTV.setText(provider.lastMsg);
timeTV.setText(provider.time);
side = provider.side;
if(side == 0){
sideTV.setText("Who?:");
}
else if(side == 1){
sideTV.setText("You:");
}
roomhash = provider.roomID;
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stuck
Log.d(TAG, "JOINING ROOMID" + chat_list.get(position).roomID);
mSocket.emit("CreateRoom", chat_list.get(position).roomID, chat_list.get(position).gcmID);
//THE CODE TO OPEN CURRENTCHAT FRAGMENTS SHOULD GO HERE
}
});
notifyDataSetChanged();
return convertView;
}
}
package com.example.jj.fragments;
import android.support.v4.app.FragmentActivity;
/**
* Created by jj on 11/28/2015.
*/
public class ChatListDataProvider extends FragmentActivity{
public String roomID;
public String gcmID;
public String lastMsg;
public String date;
public String time;
public int side;
private ChatAdapter chat;
public ChatListDataProvider (String gcmID) {
super();
}
public ChatListDataProvider (String roomID, String gcmID, String lastMsg, int side, String time, String date) {
this.roomID = roomID;
this.gcmID = gcmID;
this.lastMsg = lastMsg;
this.side = side;
this.date = date;
}
}
package com.example.jj.fragments;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class CurrentChat extends Fragment {
public static final String ARG_PAGE = "ARG_PAGE";
public static CurrentChat newInstance(int page) {
Bundle args = new Bundle();
args.putInt(ARG_PAGE, page);
CurrentChat fragment = new CurrentChat();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.currentchat, container, false);
return view;
}
}
为了做到这一点,您可以在适配器内创建一个函数,像这样传递当前活动上下文和容器/框架布局
public void changeFragmentFromAdapter(Activity act , int layoutid)
{
YourFragment fragmentToPopulate = new YourFragment();
FragmentManager frgManager = act.getFragmentManager();
FragmentTransaction fgTransation = frgManager.beginTransaction();
FgTransation.replace(layoutid, fragmentToPopulate).commit();
}
将此函数粘贴到ChatListAdapter中。
现在在ChatList类中,将itemclicklistener添加到列表中
chatListLV.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
//Here Add call change function
adapter.changeFragmentFromAdapter(getActivity() , R.layout.chatList);
}
}
chatListLV.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
//TODO自动生成的方法存根
//这里添加调用更改功能
changeFragmentFromAdapter(getActivity(),R.layout.chatList);
}
}
我假设R.layout.chatList是MainActivity中3个片段的容器。
现在从片段的活动调用此函数。检查我更新的帖子。我想添加代码以在我的ChatListAdapter中启动新片段。我还收到以下错误“无法解析方法”getSupportFragmentManager()“.@Arslanth此解决方案应该有效。只需一点。您是否使用AppCompatActivity?不,我正在扩展该类中的片段?我的意思是,您的片段在哪个活动上?片段必须始终在活动上?那么,哪个是您的?我的主要活动有3个片段(兴趣、聊天列表、LiveFeed).但是,在我使用ChatListAdapter的ChatList片段中,当在适配器中单击某个元素时,我想在其上打开一个名为CurrentChat的新片段。