gpt4 book ai didi

java - ViewPager、FragmentStatePagerAdapter、ListFragment单独列出每个Fragment的数据

转载 作者:行者123 更新时间:2023-12-01 15:28:29 27 4
gpt4 key购买 nike

我有一个 ViewPager,其中的页面数是动态的。每个页面都需要从数据库读取并显示该页面的数据集。

我将当前选定的页面标题与数据库“用户名”中的第一个值进行比较,以检查数据是否与该页面相关。

我的 fragment 虽然没有正确显示数据。我尝试在 onCreateView 中设置 arrayAdapter,但在创建每个 fragment 时不会调用它。在我的测试用例中,我有三个 fragment :user1、user2、user3。 onCreateView 最初是在 user1 上调用的,然后只有当我滑回 user2 时才会再次调用,并且不会再为 user1 或 user3 调用。

我需要能够专门为每个 fragment 设置 arrayAdapter,因为每个 fragment 都会显示不同的值数组。

PagerAdapter

   public class ExamplePagerAdapter extends FragmentStatePagerAdapter implements TitleProvider{

private Map<Integer, UserFragment> mPageReferenceMap = new HashMap<Integer, UserFragment>();

public ExamplePagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public int getCount() {
return user;
}

@Override
public Fragment getItem(int position) {
Fragment fragment = new UserFragment();

Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}

@Override
public String getTitle(int pos) {
return "@"+users[pos].getName();
}

@Override
public void destroyItem(View container, int position, Object object) {
mPageReferenceMap.remove(Integer.valueOf(position));
}
}

用户 fragment

public class UserFragment extends ListFragment {
Context ctx;
View v;
Button mAddEntry;
static int p;
static ArrayList<String> entryArray;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ctx = container.getContext();
if (v != null)
return v;

v = inflater.inflate(R.layout.user_fragment, container, false);
mAddEntry = (Button) v.findViewById(R.id.entry_b);
mAddEntry.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle b = new Bundle();
b.putInt("pos", p);
Intent mi = new Intent(v.getContext(), EntryAdd.class);
mi.putExtras(b);
startActivity(mi);
}
});
updateUserFrag();
return v;
}

public void updateUserFrag () {
entryArray = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
final DBAdapter db = new DBAdapter(ctx);
db.open();
Cursor c = db.getAllEntries();
try {
while (c.moveToNext()) {
if (c.getString(0).equals(MainActivity.users[p].getName())) {
sb.append(c.getString(1));
entryArray.add(sb.toString());
}
}
} catch (Exception e) {}
c.close();
db.close();

ArrayAdapter<String> a = new ArrayAdapter<String>(ctx, android.R.layout.simple_list_item_1, entryArray);
setListAdapter(a);
}

}

基本上,我只需要一个可以在创建每个 fragment 时为其提供数据的方法。 onCreateView() 不会为每个 fragment 调用,所以这对我来说没有用。

更新我想我已经差不多明白了,但我不明白最后一部分。我使用 TitlePageIndicators onPageSelected 方法将数据发送到我的 fragment 处理程序。

   TitlePageIndicator indicator = (TitlePageIndicator)findViewById(R.id.indicator);
indicator.setViewPager(pager, 0);
indicator.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
Message msg = UserFragment.handy.obtainMessage();
Bundle b = new Bundle();
b.putInt("m", 0);
b.putInt("p", position);
b.putStringArrayList("e", updateUserFrag(position));
msg.setData(b);
UserFragment.handy.handleMessage(msg);
}

处理程序

   static Handler handy = new Handler() { 
public void handleMessage(Message msg) {
int p = msg.getData().getInt("p");
int m = msg.getData().getInt("m");
ArrayList<String> e = msg.getData().getStringArrayList("e");

switch (m) {
case 0:
Log.d("HANDLER", Integer.toString(p));
for (int i=0;i<e.size();i++) {
//Log.d("ENTRY", e.get(i));
}
break;
}
}
};

问题是,当调用处理程序时,Arrayadapter 已经设置完毕,我可以找到一种方法来触发该数据的刷新。

最佳答案

 @Override
public void onPageSelected(int position) {
Message msg = UserFragment.handy.obtainMessage();
Bundle b = new Bundle();
b.putInt("m", 0);
b.putInt("p", position);
b.putStringArrayList("e", updateUserFrag(position));
msg.setData(b);
UserFragment.handy.handleMessage(msg);
}

public ArrayList<String> updateUserFrag (int p) {
entryArray = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
DBAdapter db = new DBAdapter(this);
db.open();
Cursor c = db.getAllEntries();
try {
while (c.moveToNext()) {
if (c.getString(0).equals(users[p].getName())) {
sb.append(c.getString(1));
entryArray.add(sb.toString());
}
}
} catch (Exception e) {}
c.close();
db.close();
return entryArray;
}

用户 fragment

public class UserFragment extends ListFragment {
Context ctx;
View v;
Button mAddEntry;
static int p;
static ArrayList<String> entryArray;
static ArrayAdapter<String> a;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ctx = container.getContext();
if (v != null)
return v;

v = inflater.inflate(R.layout.user_fragment, container, false);
mAddEntry = (Button) v.findViewById(R.id.entry_b);
mAddEntry.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle b = new Bundle();
b.putInt("pos", p);
Intent mi = new Intent(v.getContext(), EntryAdd.class);
mi.putExtras(b);
startActivity(mi);
}
});
updateUserFrag(p);
return v;
}

public void updateUserFrag (int p) {
entryArray = new ArrayList<String>();
a = new ArrayAdapter<String>(ctx, android.R.layout.simple_list_item_1, entryArray);
setListAdapter(a);
}

static Handler handy = new Handler() {
public void handleMessage(Message msg) {
int p = msg.getData().getInt("p");
int m = msg.getData().getInt("m");
ArrayList<String> e = msg.getData().getStringArrayList("e");

switch (m) {
case 0:
Log.d("HANDLER", Integer.toString(p));
entryArray.clear();
for (int i=0;i<e.size();i++) {
entryArray.add(e.get(i));
}
a.notifyDataSetChanged();
break;
}
}
};
}

关于java - ViewPager、FragmentStatePagerAdapter、ListFragment单独列出每个Fragment的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9880421/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com