android fragment中listview有listview,每次进入这个fragment中listview,listview的item都会重复加载。如何解决?

fragment中嵌套listview,切换时数据出现重复加载,各位大神该如何解决!!!! - 开源中国社区
当前访客身份:游客 [
当前位置:
fragment代码:
public class VideoFragment extends BaseFragment {
@Bind(R.id.vSwipeRefreshLayout)
SwipeRefreshLayout vSwipeRefreshL
@Bind(R.id.videoListView)
ListView videoListV
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_video, container, false);
ListView listView = (ListView) rootView.findViewById(R.id.videoListView);
return rootV
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this,view);
VideoAdapter videoAdapter = new VideoAdapter(getActivity(),articleArrayList);
videoListView.setAdapter(videoAdapter);
logger.e("======= videoAdapter : " + videoAdapter);
videoListView.setOnItemClickListener(new VideoAdapter(){
public void onItemClick(AdapterView&?& parent, View view, int position, long id) {
startActivity(new Intent(getActivity()),);
vSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
public void onRefresh() { //下拉刷新
logger.e("====== onRefresh");
handler.postDelayed(new Runnable() {
public void run() {
vSwipeRefreshLayout.setRefreshing(false);
ArrayList&Article&articleList = new ArrayList&&();
for(int i=0;i&articleList.size();i++)
requestArticleList();
* fragment隐藏或显示时回调改方法
* @param hidden
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
logger.e("======= onHiddenChanged hidden: " + hidden);
if (!hidden) {
requestArticleList();
* 获取软文列表
public void requestArticleList() {
NetRequestHelperV3.getInstance().sendHttpRequestWithPost(APIs.API.Url_weixincms_article_getList, null, APIs.API_CODE.Code_weixincms_article_getList, mResponseCallBack);
/** 软文列表 **/
ArrayList&Article& articleArrayList = new ArrayList&&();
ResponseCallBack mResponseCallBack = new ResponseCallBack&String&() {
public void onSuccess(int requestCode, String result) {
if (requestCode == APIs.API_CODE.Code_weixincms_article_getList) {
logger.e("====== result: " + result);
JSONObject jsonObject = new JSONObject(result);
String message = jsonObject.optString("message");
int state = jsonObject.optInt("state");
int errorCode = jsonObject.optInt("errorCode");
if (state==0&&errorCode ==0) {
JSONArray articleArray =
jsonObject.optJSONArray("result");
for (int i=0;i&articleArray.length();i++) {
Article article = new Article();
article.title= ((JSONObject) articleArray.get(i)).optString("title");
article.url= ((JSONObject) articleArray.get(i)).optString("url");
article.description= ((JSONObject) articleArray.get(i)).optString("description");
JSONObject userObj = ((JSONObject) articleArray.get(i)).optJSONObject("user");
article.author = userObj.optString("name");
articleArrayList.add(article);
logger.e("======= articleArrayList size: "+articleArrayList.size());
} catch (JSONException e) {
e.printStackTrace();
public void onFailure(int requestCode, int errorCode) {
if (requestCode == APIs.API_CODE.Code_weixincms_article_getList) {
自定义adapter代码:
public class VideoAdapter extends BaseAdapter{
ArrayList&Article&
这个构造器就是用来接收数据用的适配器
public VideoAdapter(Context context,ArrayList&Article& articles) {
this.context =
this.articles =
// 得到数据的总数
public int getCount() {
return articles.size();
// 根据数据索引得到集合中所对应的指定的数据
public Object getItem(int position) {
return articles.get(position);
public long getItemId(int position) {
当listview每显示一个条目的时候就自动调用getView方法
convertView :注意listview可以对第一屏显示的内容(条目对象)进行缓存
当显示第二屏,第三屏的时候会使用缓存的数据.convertView就是缓存的第一屏数据.
public View getView(int position, View convertView, ViewGroup parent) {
final Article article = articles.get(position);
ViewHolder vh =
if (convertView == null&& context != null){// 如果显示的是第一屏,也就是说convertView还没有进行缓存.就进行创建第一屏
vh=new ViewHolder();
convertView=View.inflate(context, R.layout.listview_item_video, null);
vh.vTitle = (TextView)convertView.findViewById(R.id.vTitle);
vh.vDescription = (TextView)convertView.findViewById(R.id.vDescription);
// 利用这个属性来保存这个包装对象.
convertView.setTag(vh);
// 如果不是第一屏的话,说明缓存对象已经有内容了,这时候就直接从包装对象中取得第一屏,得到包装类对象.
vh= (ViewHolder) convertView.getTag();
vh.vTitle.setText(article.title);
vh.vDescription.setText(article.description);
return convertV
public class ViewHolder {
TextView vT
TextView vD
TextView evaluationT
TextView dynamicT
TextView dynamicTv;
ImageView dynamicPhotoI
共有3个答案
<span class="a_vote_num" id="a_vote_num_
articleArrayList.clear();明显没清空啊
--- 共有 1 条评论 ---
新手一枚,请问哪些地方需要改改
(2个月前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
试试在写入你的list之前先把list清空。list。clear,具体操作参考:
<span class="a_vote_num" id="a_vote_num_
引用来自“wanglinbo123”的评论articleArrayList.clear();明显没清空啊回复
: ResponseCallBack mResponseCallBack = new ResponseCallBack&String&() {
& & & & @Override
& & & & public void onSuccess(int requestCode, String result) {
& & & & & & if (requestCode == APIs.API_CODE.Code_weixincms_article_getList) {
& & & & & & & & //清空 & &
& & & & & & & & articleArrayList.clear();
& & & & & & & & logger.e("====== result: " + result);
& & & & & &&
--- 共有 1 条评论 ---
非常感谢,问题在您的帮助下已解决
(2个月前)&nbsp&
更多开发者职位上
有什么技术问题吗?
极客开源...的其它问题
类似的话题android Fragment 使用adapter时getView 方法不执行,在Activity下可以执行 - 开源中国社区
当前访客身份:游客 [
当前位置:
在网上也看了很多相关文章了,还是没有解决,在Activity下使用此代码没有任何问题,数据可以显示,但是用了Fragment adapter的getView方法就一直不执行。 我觉得他们之间唯一的区别的就是context 和view 的不同,请大神指教
public class BookSearchActivity extends Fragment {
private BookSearchS
private List&Books&
private BookSearchA
private Handler mH
private ListView listV
private ProgressD
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
context= getActivity();
v = inflater.inflate(R.layout.booksearch, container, false);
return inflater.inflate(R.layout.booksearch, container, false);
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mHandler = new Handler();
new Thread(new Runnable() {
public void run() {
service = new BookSearchService();
list = service.queryBookList(&&, &&);
if (list == null)
result = ApplConst.FAILURE;
result = ApplConst.SUCCESS;
adapter = new BookSearchAdapter(list,context);
mHandler.post(new Runnable() {
public void run() {
// TODO Auto-generated method stub
listView = ((ListView) v.findViewById(R.id.books_list_view));
listView.setAdapter(adapter);
listView.setDividerHeight(1); // 不显示分割线
listView.setCacheColorHint(Color.TRANSPARENT); //防止listview背景变黑
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView&?& parent,
View view, int position, long id) {
Intent newActivity = new Intent(view.getContext(),
BookSearchActivity.class);
Books book = (Books) listView.getItemAtPosition(position);
newActivity.putExtra(&BookId&,
book.getId());
newActivity.putExtra(&categoryId&,
book.getCategoryId());
startActivity(newActivity);
if(result.equals(ApplConst.FAILURE))
Toast.makeText(MainActivity.this, &数据加载失败,服务器异常&,
Toast.LENGTH_LONG).show();
if(result.equals(ApplConst.NET_EXCEPTION))
Toast.makeText(MainActivity.this, &数据加载失败,请检查网络&,
Toast.LENGTH_LONG).show();
//dialog.dismiss();
}).start();
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// Adapter
public class BookSearchAdapter extends BaseAdapter {
private int resourceId;
private List&Books& booksL
private Map&Integer, View& rowViews = new HashMap&Integer, View&();
private Context context =
public BookSearchAdapter(List&Books& objects, Context context) {
booksList =
this.context =
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = rowViews.get(position);
if (rowView == null) {
SimpleDateFormat df = new SimpleDateFormat(&HH:mm:ss&);
LayoutInflater layoutInflater = LayoutInflater.from(context);
rowView = layoutInflater.inflate(R.layout.booksearch_items,
TextView publicationDate = (TextView) rowView
.findViewById(R.id.dtPublicationDate);
TextView bookName = (TextView) rowView
.findViewById(R.id.txtBookName);
TextView publish = (TextView) rowView
.findViewById(R.id.TxtPublish);
TextView writor = (TextView) rowView
.findViewById(R.id.txtWritor);
Books books = booksList.get(position);
if (books.publicationDate != null)
publicationDate.setText(&出版时间:&
+ DateUtil.parseDateToString(
books.getPublicationDate(), df));
if(books.getBookName()!=null)
bookName.setText(books.getBookName());
if(books.getWritor()!=null)
writor.setText(&编者:&+books.getWritor());
if(books.getBookName()!=null)
publish.setText(&出版社:&+books.getPublish());
rowViews.put(position, rowView);
return rowV
public int getCount() {
return booksList.size();
public Object getItem(int position) {
return booksList.get(position);
public long getItemId(int position) {
共有3个答案
<span class="a_vote_num" id="a_vote_num_
listFragment& 返回的根布局是什么样的啊?
<span class="a_vote_num" id="a_vote_num_
谢谢,问题解决了。使用 ListFragment & &&setListAdapter(adapter)后进入getView了
<span class="a_vote_num" id="a_vote_num_
请用ListFragment
更多开发者职位上
有什么技术问题吗?
Polly蜀...的其它问题
类似的话题android - setOnItemClickListener for ListView in a fragment - Stack Overflow
to customize your list.
Announcing Stack Overflow Documentation
We started with Q&A. Technical documentation is next, and we need your help.
Whether you're a beginner or an experienced developer, you can contribute.
I'm having problems clicking on ListView items in the fragments. I wrote the code so the fragments point to layout files for everything and inside the 2 of the layouts are ListViews, which retrieve their entries from items in a string array in the strings.xml. I could not find a way to implement a setOnItemClickListener for each ListView item in my case due to the way I wrote the code.
MainActivity.java
package com.example.test_
import android.os.B
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentM
import android.support.v4.view.ViewP
import android.view.M
public class MainActivity extends FragmentActivity{
ViewPager ViewPager =
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager= (ViewPager) findViewById(R.id.pager);
FragmentManager fragmentManager=getSupportFragmentManager();
ViewPager.setAdapter(new AdapterActivity(fragmentManager));
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
AdapterActivity.java
package com.example.test_
import android.os.B
import android.support.v4.app.F
import android.support.v4.app.FragmentM
import android.support.v4.app.FragmentStatePagerA
import android.view.LayoutI
import android.view.V
import android.view.ViewG
public class AdapterActivity extends FragmentStatePagerAdapter{
public AdapterActivity(FragmentManager fm){
super(fm);
public Fragment getItem(int i){
Fragment fragment=
fragment=new HomeFragment();
fragment=new CommunityFragment();
fragment=new ResourcesFragment();
public int getCount(){
public CharSequence getPageTitle(int position){
if(position==0){
return "Home Page";
if(position==1){
return "Community";
if(position==2){
return "Resources";
class HomeFragment extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.home_fragment, container, false);
class CommunityFragment extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(munity_fragment, container, false);
class ResourcesFragment extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.resources_fragment, container, false);
Then in the resources_fragment.xml layout, there is a ListView
android:id="@+id/resourcesListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/categories" &
&/ListView&
It grabs entries from strings.xml
&string-array name="categories"&
&item&Category 1&/item&
&item&Category 2&/item&
&item&Category 3&/item&
&item&Category 4&/item&
&item&Category 5&/item&
&item&Category 6&/item&
&item&Category 7&/item&
&item&Category 8&/item&
&/string-array&
I used , but the setOnItemClickListener won't work for me. How else can I connect each listview item other activities?
15.8k33253
The place to add your ListView.SetOnItemClickListener is in your fragment creation code, after you inlfate the layouts.
Use findViewById to find your ListView, and add your setOnItemClick listener.
class ResourcesFragment extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View view = inflater.inflate(R.layout.resources_fragment, container, false);
ListView lv = (ListView) view.findViewById(R.id.mylistviewid);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView&?& arg0, View arg1,
int position, long arg3) {
// TODO Auto-generated method stub
String category = categories[position];
Class activityClass = lookupActivityClass_byName(category);
//You could lookup by position, but "name" is more general
Intent intent = new Intent(getActivity(), activityClass);
startActivity(intent);
4,48511124
When you use Fragment, you can find views inside onCreateView(). In simpler term, it's same as of onCreate() of Activity.
So in this case, find ListView inside onCreateView() and assign onItemClickListener there only.
73k52191248
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you&#39;re looking for?
Browse other questions tagged
Stack Overflow works best with JavaScript enabled<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&

我要回帖

更多关于 fragment使用listview 的文章

 

随机推荐